MD,终于能在Visual Studio集成开发环境里面直接编译 Vim 源代码了

陪她去流浪 桃子 2015年12月13日 阅读次数:2879

花了半天的工夫+功夫,终于能在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,只是生成。

这篇文章的内容已被作者标记为“过时”/“需要更新”/“不具参考意义”。

标签:vim