花了半天的工夫+功夫,终于能在VisualStudio里面直接一键编译VIM的源代码了。放在这里了:GitHub: movsb/vim。
需要编译VIM的源代码的原因很简单,就是我需要对其作一些偏好设置(hack)。尝试了一下在cmd下用nmake编译,编译成功,之前“在GVim中使用所有的Windows字体的方法”就提到过怎么用修改源代码后用nmake编译。但对于习惯了用VS边调试边修改的我实在无法习惯makefile的方式。
虽然我高度赞美VIM,它的高效无可比拟,You are truly the best,但对于你的项目源代码管理我依然吐槽几句:你tm把源代码、资源文件、中间生成文件、目标exe文件、makefile、安装文件全部放在一个文件夹下面是几个意思???像一坨翔一样。这样真的好吗???
有图有真相:
这一折腾就是一个下午的时间,下午说下如何简单地从Makefile手动建立项目(VS提供了新建Makefile Project,但貌似真的没什么卵用)。
首先,找到用于Windows平台用VS编译的Makefile文件:src/Make_mvc.mak,看一下说明,判断一此哪些是重要的选项,然后就可以尝试在cmd下编译。一般是没有错误的。
C:\Users\Tao\Desktop\vim\src>nmake -f Make_mvc.mak GUI=yes IME=yes DEBUG=no MBYTE=yes clean Microsoft (R) Program Maintenance Utility Version 6.00.9782.0 Copyright (C) Microsoft Corp 1988-1998. All rights reserved. if exist .\ObjGix86/nul rmdir /s /q .\ObjGix86 if exist *.obj del *.obj if exist gvim.exe del gvim.exe if exist gvim.ilk del gvim.ilk if exist gvim.pdb del gvim.pdb if exist gvim.map del gvim.map if exist gvim.ncb del gvim.ncb if exist vimrun.exe del vimrun.exe if exist install.exe del install.exe if exist uninstal.exe del uninstal.exe if exist if_perl.c del if_perl.c if exist dimm.h del dimm.h if exist dimm_i.c del dimm_i.c if exist dimm.tlb del dimm.tlb if exist dosinst.exe del dosinst.exe if exist mzscheme_base.c del mzscheme_base.c cd xxd NMAKE /NOLOGO -f Make_mvc.mak clean if exist xxd.obj del xxd.obj if exist xxd.exe del xxd.exe cd .. cd GvimExt NMAKE /NOLOGO -f Makefile clean if exist gvimext.dll del gvimext.dll if exist gvimext.lib del gvimext.lib if exist gvimext.exp del gvimext.exp if exist gvimext.obj del gvimext.obj if exist gvimext.res del gvimext.res if exist gvimext.dll.manifest del gvimext.dll.manifest cd .. cd GvimExt NMAKE /NOLOGO -f Makefile clean if exist gvimext.dll del gvimext.dll if exist gvimext.lib del gvimext.lib if exist gvimext.exp del gvimext.exp if exist gvimext.obj del gvimext.obj if exist gvimext.res del gvimext.res if exist gvimext.dll.manifest del gvimext.dll.manifest cd .. if exist testdir\*.out del testdir\*.out C:\Users\Tao\Desktop\vim\src>nmake -f Make_mvc.mak GUI=yes IME=yes DEBUG=no MBYTE=yes Microsoft (R) Program Maintenance Utility Version 6.00.9782.0 Copyright (C) Microsoft Corp 1988-1998. All rights reserved. if not exist .\ObjGix86/nul mkdir .\ObjGix86 creating .\ObjGix86\pathdef.c cl -c /W3 /nologo -I. -Iproto -DHAVE_PATHDEF -DWIN32 -DFEAT_CSCOPE -DFEAT_NETBEANS_INTG -DFEAT_XPM_W32 -DWINVER=0x0400 -D_WIN32_WINNT=0x0400 /Fo.\ObjGix86/ /Ox -DNDEBUG /Zl /MT -DFEAT_MBYTE_IME -DDYNAMIC_IME -DFEAT_MBYTE -DFEAT_GUI_W32 -DDYNAMIC_ICONV -DDYNAMIC_GETTEXT -DFEAT_BIG /Fd.\ObjGix86/ /Zi .\ObjGix86\pathdef.c pathdef.c rc /l 0x409 /Fo.\ObjGix86/vim.res /r -DWIN32 -D_WIN32 -DWINVER=0x0500 -DNDEBUG -DFEAT_GUI_W32 vim.rc cl -c /W3 /nologo -I. -Iproto -DHAVE_PATHDEF -DWIN32 -DFEAT_CSCOPE -DFEAT_NETBEANS_INTG -DFEAT_XPM_W32 -DWINVER=0x0400 -D_WIN32_WINNT=0x0400 /Fo.\ObjGix86/ /Ox -DNDEBUG /Zl /MT -DFEAT_MBYTE_IME -DDYNAMIC_IME -DFEAT_MBYTE -DFEAT_GUI_W32 -DDYNAMIC_ICONV -DDYNAMIC_GETTEXT -DFEAT_BIG /Fd.\ObjGix86/ /Zi -I xpm\x86\include -I xpm\x86\..\include xpm_w32.c xpm_w32.c cl -c /W3 /nologo -I. -Iproto -DHAVE_PATHDEF -DWIN32 -DFEAT_CSCOPE -DFEAT_NETBEANS_INTG -DFEAT_XPM_W32 -DWINVER=0x0400 -D_WIN32_WINNT=0x0400 /Fo.\ObjGix86/ /Ox -DNDEBUG /Zl /MT -DFEAT_MBYTE_IME -DDYNAMIC_IME -DFEAT_MBYTE -DFEAT_GUI_W32 -DDYNAMIC_ICONV -DDYNAMIC_GETTEXT -DFEAT_BIG /Fd.\ObjGix86/ /Zi blowfish.c buffer.c charset.c crypt.c crypt_zip.c diff.c digraph.c edit.c eval.c ex_cmds.c ex_cmds2.c ex_docmd.c ex_eval.c ex_getln.c fileio.c fold.c getchar.c hardcopy.c hashtab.c main.c mark.c mbyte.c memfile.c memline.c menu.c message.c misc1.c misc2.c move.c normal.c ops.c option.c os_mswin.c winclip.c os_win32.c popupmnu.c quickfix.c regexp.c screen.c search.c sha256.c spell.c syntax.c tag.c term.c ui.c undo.c window.c gui.c gui_beval.c gui_w32.c os_w32exe.c if_cscope.c netbeans.c blowfish.c buffer.c charset.c crypt.c crypt_zip.c diff.c digraph.c edit.c eval.c ex_cmds.c ex_cmds2.c ex_docmd.c ex_eval.c ex_getln.c fileio.c fold.c getchar.c hardcopy.c hashtab.c main.c Generating Code... Compiling... mark.c mbyte.c memfile.c memline.c menu.c message.c misc1.c misc2.c move.c normal.c ops.c option.c os_mswin.c winclip.c os_win32.c popupmnu.c quickfix.c regexp.c screen.c search.c Generating Code... Compiling... sha256.c spell.c syntax.c tag.c term.c ui.c undo.c window.c gui.c gui_beval.c gui_w32.c os_w32exe.c if_cscope.c netbeans.c Generating Code... cl -c /W3 /nologo -I. -Iproto -DHAVE_PATHDEF -DWIN32 -DFEAT_CSCOPE -DFEAT_NETBEANS_INTG -DFEAT_XPM_W32 -DWINVER=0x0400 -D_WIN32_WINNT=0x0400 /Fo.\ObjGix86/ /Ox -DNDEBUG /Zl /MT -DFEAT_MBYTE_IME -DDYNAMIC_IME -DFEAT_MBYTE -DFEAT_GUI_W32 -DDYNAMIC_ICONV -DDYNAMIC_GETTEXT -DFEAT_BIG /Fd.\ObjGix86/ /Zi version.c version.c link /RELEASE /nologo /subsystem:windows -out:gvim.exe .\ObjGix86\blowfish.obj .\ObjGix86\buffer.obj .\ObjGix86\charset.obj .\ObjGix86\crypt.obj .\ObjGix86\crypt_zip.obj .\ObjGix86\diff.obj .\ObjGix86\digraph.obj .\ObjGix86\edit.obj .\ObjGix86\eval.obj .\ObjGix86\ex_cmds.obj .\ObjGix86\ex_cmds2.obj .\ObjGix86\ex_docmd.obj .\ObjGix86\ex_eval.obj .\ObjGix86\ex_getln.obj .\ObjGix86\fileio.obj .\ObjGix86\fold.obj .\ObjGix86\getchar.obj .\ObjGix86\hardcopy.obj .\ObjGix86\hashtab.obj .\ObjGix86\main.obj .\ObjGix86\mark.obj .\ObjGix86\mbyte.obj .\ObjGix86\memfile.obj .\ObjGix86\memline.obj .\ObjGix86\menu.obj .\ObjGix86\message.obj .\ObjGix86\misc1.obj .\ObjGix86\misc2.obj .\ObjGix86\move.obj .\ObjGix86\normal.obj .\ObjGix86\ops.obj .\ObjGix86\option.obj .\ObjGix86\os_mswin.obj .\ObjGix86\winclip.obj .\ObjGix86\os_win32.obj .\ObjGix86\pathdef.obj .\ObjGix86\popupmnu.obj .\ObjGix86\quickfix.obj .\ObjGix86\regexp.obj .\ObjGix86\screen.obj .\ObjGix86\search.obj .\ObjGix86\sha256.obj .\ObjGix86\spell.obj .\ObjGix86\syntax.obj .\ObjGix86\tag.obj .\ObjGix86\term.obj .\ObjGix86\ui.obj .\ObjGix86\undo.obj .\ObjGix86\window.obj .\ObjGix86\vim.res .\ObjGix86\gui.obj .\ObjGix86\gui_beval.obj .\ObjGix86\gui_w32.obj .\ObjGix86\os_w32exe.obj .\ObjGix86/if_cscope.obj .\ObjGix86/netbeans.obj .\ObjGix86/xpm_w32.obj .\ObjGix86\version.obj oldnames.lib kernel32.lib advapi32.lib shell32.lib gdi32.lib comdlg32.lib ole32.lib uuid.lib /machine:ix86 gdi32.lib version.lib winspool.lib comctl32.lib advapi32.lib shell32.lib /machine:ix86 /nodefaultlib libcmt.lib user32.lib WSock32.lib xpm\x86\lib\libXpm.lib /PDB:gvim.pdb -debug if exist gvim.exe.manifest mt.exe -nologo -manifest gvim.exe.manifest -updateresource:gvim.exe;1 cl /nologo -DNDEBUG vimrun.c vimrun.c cl /nologo -DNDEBUG -DWIN32 dosinst.c kernel32.lib shell32.lib user32.lib ole32.lib advapi32.lib uuid.lib dosinst.c if exist install.exe del install.exe ren dosinst.exe install.exe cl /nologo -DNDEBUG -DWIN32 uninstal.c shell32.lib advapi32.lib uninstal.c cd xxd NMAKE /NOLOGO -f Make_mvc.mak cl /nologo -DWIN32 xxd.c xxd.c cd .. cd GvimExt NMAKE /NOLOGO -f Makefile cl -c -DCRTAPI1=_cdecl -DCRTAPI2=_cdecl -nologo -D_X86_=1 -DWIN32 -D_WIN32 -W3 -D_WIN32_IE=0x0500 -DWINVER=0x0500 -DFEAT_GETTEXT -D_MT -MT gvimext.cpp gvimext.cpp Rc /r -DWIN32 -D_WIN32 -DWINVER=0x0500 gvimext.rc link /INCREMENTAL:NO /NOLOGO -dll -def:gvimext.def -base:0x1C000000 -out:gvimext.dll gvimext.obj gvimext.res ole32.lib uuid.lib oleaut32.lib kernel32.lib ws2_32.lib mswsock.lib advapi32.lib user32.lib gdi32.lib comdlg32.lib winspool.lib shell32.lib comctl32.lib Creating library gvimext.lib and object gvimext.exp if exist gvimext.dll.manifest mt -nologo -manifest gvimext.dll.manifest -outputresource:gvimext.dll;2 cd ..
然后就是挨着挨着找,看哪些源代码文件是当前编译条件下需要的,全部添加进项目。。。
就像下面这样:
再然后就是依赖库头文件/库文件,可以通过上面编译语句中的 -DVARIABLE 看出来,lib文件可以观察link命令得到。
当然,还有一些特殊的设置,比如:字符集(肯定是多字节字符集了),平台工具集(最好是先低一点的,因为版本高的VS会deprecate某些函数,导致不可用)。。。
再再然后,解决掉警告与一些奇怪的错误,就可以按下F7一键编译了。。。。。
最后说明一点,建立VS项目的原因是方便修改和调试,但由于项目建立得比较简单,配置不全,所以最终还是选用makefile生成最终的exe,只是生成。