为什么我无法使用Visual Studio 2015 RC命令行工具来构buildVim?

昨天,我安装了Visual Studio 2015 RC社区版 。 作为第一个testing,我尝试从源代码构buildGVim。

我使用"C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Visual Studio 2015\Visual Studio Tools\Windows Desktop Command Prompts\VS2015 x64 Native Tools Command Prompt.lnk"打开了一个命令窗口,

 set include=%include%;C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Include 

所以Make_mvc.mak拿起Win32.mak文件。 另外,我设定:

 set MSVCVER=12.0 

因为make文件在此处未检测到新的Visual Studio版本。

在此之后,我有:

  Framework40Version = V4.0
 FrameworkDir = C:\ WINDOWS \ Microsoft.NET \ Framework64
 FrameworkDIR64 = C:\ WINDOWS \ Microsoft.NET \ Framework64
 FrameworkVersion = v4.0.30319
 FrameworkVersion64 = v4.0.30319
 FSHARPINSTALLDIR = C:\ Program Files(x86)\ Microsoft SDKs \ F#\ 4.0 \ Framework \ v4.0 \
 INCLUDE = C:\ Program Files(x86)\ Microsoft Visual Studio 14.0 \ VC \ INCLUDE; C:\ Program Files(x86)\ Microsoft Visual Studio 14.0 \ VC \ ATLMFC \ INCLUDE; C:\ Program Files(x86)\ Windows Kits \ 10.0 \ 10056.0 \ ucrt; C:\ Program Files(x86)\ Windows Kits \ 8.1 \ include \ shared; C:\ Program Files(x86)\ Windows Kits \ 8.1 \ include \ C :\ Program Files(x86)\ Windows Kits \ 8.1 \ include \ winrt ;; C:\ Program Files(x86)\ Microsoft SDKs \ Windows \ v7.1A \ Include
 LIB = C:\ Program Files(x86)\ Microsoft Visual Studio 14.0 \ VC \ LIB \ amd64; C:\ Program Files(x86)\ Microsoft Visual Studio 14.0 \ VC \ ATLMFC \ LIB \ amd64; C:\ Program Files (x86)\ Windows Kits \ 10 \\ lib \ 10.0.10056.0 \ ucrt \ x64; C:\ Program Files(x86)\ Windows Kits \ 8.1 \ lib \ winv6.3 \ um \ x64;
 LIBPATH = C:\ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319; C:\ Program Files(x86)\ Microsoft Visual Studio 14.0 \ VC \ LIB \ amd64; C:\ Program Files(x86)\ Microsoft Visual Studio 14.0 \ VC \ ATLMFC \ LIB \ amd64; C:\ Program Files(x86)\ Windows Kits \ 8.1 \ References \ CommonConfiguration \ Neutral; \ Microsoft.VCLibs \ 14.0 \ References \ CommonConfiguration \ neutral;
 MSVCVER = 12.0
平台= X64
 PROCESSOR_ARCHITECTURE = AMD64
 UniversalCRTSdkDir = C:\ Program Files(x86)\ Windows Kits \ 10 \
 VCINSTALLDIR = C:\ Program Files(x86)\ Microsoft Visual Studio 14.0 \ VC \
 VisualStudioVersion = 14.0
 VS100COMNTOOLS = C:\ Program Files(x86)\ Microsoft Visual Studio 10.0 \ Common7 \ Tools \
 VS110COMNTOOLS = C:\ Program Files(x86)\ Microsoft Visual Studio 11.0 \ Common7 \ Tools \
 VS120COMNTOOLS = C:\ Program Files(x86)\ Microsoft Visual Studio 12.0 \ Common7 \ Tools \
 VS140COMNTOOLS = C:\ Program Files(x86)\ Microsoft Visual Studio 14.0 \ Common7 \ Tools \
 VSINSTALLDIR = C:\ Program Files(x86)\ Microsoft Visual Studio 14.0 \
 WINDIR = C:\ WINDOWS
 WindowsSdkDir = C:\ Program Files(x86)\ Windows Kits \ 8.1 \
 WindowsSDK_ExecutablePath_x64 = C:\ Program Files(x86)\ Microsoft SDKs \ Windows \ v8.1A \ bin \ NETFX 4.5.1 Tools \ x64 \
 WindowsSDK_ExecutablePath_x86 = C:\ Program Files文件(x86)\ Microsoft SDKs \ Windows \ v8.1A \ bin \ NETFX 4.5.1 Tools \ 

我能够build立一个简单的程序:

  C:\ ... \ Temp>键入tc                          
 #包括                                                    

 int main(void){                                                     
     printf(“Hello%s \ n”,“Stackoverflow.com”);                       
    返回0;                                                        
 }                                                                    

 C:\ ... \ Temp> cl tc                            
 Microsoft(R)C / C ++ Optimizing Compiler Version 19.00.22816 for x64  
版权所有(C)微软公司。 版权所有。           

 TC                                                                  
微软(R)增量链接器版本14.00.22816.0               
版权所有(C)微软公司。 版权所有。           

 /out:t.exe                                                           
 t.obj                                                                

 C:\ ... \ Temp> t.exe                             
你好,Stackoverflow.com 

但是,当我发出命令来构build我的GVim(Visual Studio 2013 CE工具正常工作),编译进行得很好,但我得到以下链接错误:

  C:\ ... \ vim \ src> nmake -f Make_mvc.mak CPU = AMD64 OPTIMIZE = SPACE GETTEXT = no NETBEANS = no CSCOPE = no DIRECTX = yes GUI = yes 

我正在剪掉大部分的错误信息,因为它们中有很多:

  gui_dwrite.obj:错误LNK2001:无法parsing的外部符号memcmp
 blowfish.obj:错误LNK2001:无法parsing的外部符号memcmp
 crypt.obj:错误LNK2001:无法parsing的外部符号memcmp
 sha256.obj:错误LNK2001:无法parsing的外部符号memcmp
 undo.obj:错误LNK2001:无法parsing的外部符号memcmp
 blowfish.obj:错误LNK2019:无法parsing的外部符号memcpy在函数bf_e_cblock中引用
 winclip.obj:错误LNK2001:无法parsing的外部符号memcpy
 screen.obj:错误LNK2001:无法parsing的外部符号memcpy
 sha256.obj:错误LNK2001:无法parsing的外部符号memcpy
 gui.obj:错误LNK2001:无法parsing的外部符号memmove
 gui_w32.obj:错误LNK2001:无法parsing的外部符号memmove
 tag.obj:错误LNK2001:无法parsing的外部符号memmove
 term.obj:错误LNK2001:未parsing的外部符号memmove
 ui.obj:错误LNK2001:无法parsing的外部符号memmove
 undo.obj:错误LNK2001:无法parsing的外部符号memmove
 screen.obj:错误LNK2001:无法parsing的外部符号memmove
 search.obj:错误LNK2001:无法parsing的外部符号memmove
 spell.obj:错误LNK2001:未parsing的外部符号memmove
 syntax.obj:错误LNK2001:无法parsing的外部符号memmove
 os_mswin.obj:错误LNK2001:无法parsing的外部符号memmove
 os_win32.obj:错误LNK2001:无法parsing的外部符号memmove
 quickfix.obj:错误LNK2001:无法parsing的外部符号memmove
 regexp.obj:错误LNK2001:无法parsing的外部符号memmove
 misc2.obj:错误LNK2001:无法parsing的外部符号memmove
 normal.obj:错误LNK2001:无法parsing的外部符号memmove
 ops.obj:错误LNK2001:无法parsing的外部符号memmove
 option.obj:错误LNK2001:无法parsing的外部符号memmove
 memline.obj:错误LNK2001:无法parsing的外部符号memmove
 menu.obj:错误LNK2001:无法parsing的外部符号memmove
 message.obj:错误LNK2001:无法parsing的外部符号memmove
 misc1.obj:错误LNK2001:无法parsing的外部符号memmove
 getchar.obj:错误LNK2001:未parsing的外部符号memmove
 hashtab.obj:错误LNK2001:无法parsing的外部符号memmove
 mark.obj:错误LNK2001:无法parsing的外部符号memmove
 ...
 misc2.obj:错误LNK2001:无法parsing的外部符号fwrite
 spell.obj:错误LNK2001:无法parsing的外部符号fwrite
 edit.obj:错误LNK2019:在函数ins_ctrl_ey中引用了无法parsing的外部符号isalnum
 regexp.obj:错误LNK2001:无法parsing的外部符号isalnum
 ui.obj:错误LNK2001:无法parsing的外部符号strncpy
 gui_w32.obj:错误LNK2001:无法parsing的外部符号strncpy
 libXpm.lib(parse.obj):错误LNK2001:无法parsing的外部符号strncpy
 libXpm.lib(data.obj):错误LNK2001:无法parsing的外部符号strncpy
 regexp.obj:错误LNK2001:无法parsing的外部符号strncpy
 screen.obj:错误LNK2001:无法parsing的外部符号strncpy
 ...
 main.obj:错误LNK2001:无法parsing的外部符号closures
 memfile.obj:错误LNK2001:无法parsing的外部符号closures
 libXpm.lib(parse.obj):错误LNK2001:无法parsing的外部符号
 libXpm.lib(hashtab.obj):错误LNK2001:无法parsing的外部符号
 libXpm.lib(data.obj):错误LNK2001:无法parsing的外部符号
 libXpm.lib(misc.obj):错误LNK2001:无法parsing的外部符号
 ...
 eval.obj:错误LNK2001:无法parsing的外部符号
 misc2.obj:错误LNK2001:无法parsing的外部符号
 os_win32.obj:错误LNK2001:无法parsing的外部符号
 gui_w32.obj:错误LNK2001:无法parsing的外部符号
 libcmt.lib(new_scalar.obj):错误LNK2001:无法parsing的外部符号malloc
 libXpm.lib(simx.obj):错误LNK2001:无法parsing的外部符号malloc
 eval.obj:错误LNK2001:无法parsing的外部符号malloc
 misc2.obj:错误LNK2001:无法parsing的外部符号malloc
 os_win32.obj:错误LNK2001:无法parsing的外部符号malloc
 gui_w32.obj:错误LNK2001:无法parsing的外部符号malloc
 normal.obj:错误LNK2001:无法parsing的外部符号realloc
 regexp.obj:错误LNK2001:无法parsing的外部符号realloc
 libXpm.lib(simx.obj):错误LNK2001:无法parsing的外部符号realloc
 eval.obj:错误LNK2001:无法parsing的外部符号realloc
 memline.obj:错误LNK2001:无法parsing的外部符号realloc
 misc1.obj:错误LNK2001:无法parsing的外部符号realloc
 misc2.obj:错误LNK2001:无法parsing的外部符号realloc
 ...
 ex_docmd.obj:错误LNK2001:无法parsing的外部符号stricmp
 ops.obj:错误LNK2001:无法parsing的外部符号__stdio_common_vfprintf
 option.obj:错误LNK2001:无法parsing的外部符号__stdio_common_vfprintf
 search.obj:错误LNK2001:无法parsing的外部符号__stdio_common_vfprintf
 spell.obj:错误LNK2001:无法parsing的外部符号__stdio_common_vfprintf
 fold.obj:错误LNK2001:无法parsing的外部符号__stdio_common_vfprintf
 getchar.obj:错误LNK2001:无法parsing的外部符号__stdio_common_vfprintf
 main.obj:错误LNK2001:无法parsing的外部符号__stdio_common_vfprintf
 mark.obj:错误LNK2001:无法parsing的外部符号__stdio_common_vfprintf
 eval.obj:错误LNK2001:无法parsing的外部符号__stdio_common_vfprintf
 ex_cmds.obj:错误LNK2001:无法parsing的外部符号__stdio_common_vfprintf
 ex_docmd.obj:错误LNK2001:无法parsing的外部符号__stdio_common_vfprintf
 ex_getln.obj:错误LNK2001:无法parsing的外部符号__stdio_common_vfprintf
 window.obj:错误LNK2001:无法parsing的外部符号__stdio_common_vsprintf
 gui.obj:错误LNK2001:无法parsing的外部符号__stdio_common_vsprintf
 gui_w32.obj:错误LNK2001:无法parsing的外部符号__stdio_common_vsprintf
 version.obj:错误LNK2001:无法parsing的外部符号__stdio_common_vsprintf
 spell.obj:错误LNK2001:无法parsing的外部符号__stdio_common_vsprintf
 syntax.obj:错误LNK2001:无法parsing的外部符号__stdio_common_vsprintf
 tag.obj:错误LNK2001:无法parsing的外部符号__stdio_common_vsprintf
 term.obj:错误LNK2001:无法parsing的外部符号__stdio_common_vsprintf
 regexp.obj:错误LNK2001:无法parsing的外部符号__stdio_common_vsprintf
 screen.obj:错误LNK2001:无法parsing的外部符号__stdio_common_vsprintf
 search.obj:错误LNK2001:无法parsing的外部符号__stdio_common_vsprintf
 sha256.obj:错误LNK2001:无法parsing的外部符号__stdio_common_vsprintf
 ops.obj:错误LNK2001:无法parsing的外部符号__stdio_common_vsprintf
 option.obj:错误LNK2001:无法parsing的外部符号__stdio_common_vsprintf
 ...
在_onexit函数中引用_crt_atexit
 libcmt.lib(utility.obj):错误LNK2019:无法parsing的外部符号_crt_at_quick_exit在函数at_quick_exit中引用
 libcmt.lib(utility.obj):错误LNK2019:函数中引用的无法parsing的外部符号_cexit __scrt_dllmain_uninitialize_c
 libcmt.lib(exe_winmain.obj):错误LNK2001:无法parsing的外部符号_cexit
 libcmt.lib(new_scalar.obj):错误LNK2019:在函数“void * __cdecl operator new(unsigned __int64)”(?2 @ YAPEAX_K @ Z)中引用的未parsing外部符号_callnewh
 libcmt.lib(exe_winmain.obj):error LNK2019:无法parsing的外部符号_seh_filter_exe在函数“int”中引用int __cdecl __scrt_common_main_seh(void)'::`1':: filt $ 0“(?filt $ 0 @?0 ?? __ scrt_common_main_seh @ @ YAHXZ @ 4HA)
 libcmt.lib(exe_winmain.obj):错误LNK2019:在函数“int __cdecl pre_c_initialization(void)”中引用了无法parsing的外部符号_set_app_type(?pre_c_initialization @@ YAHXZ)
 libcmt.lib(exe_winmain.obj):错误LNK2019:无法parsing的外部符号__setusermatherr在函数“int __cdecl pre_c_initialization(void)”中引用(?pre_c_initialization @@ YAHXZ)
 libcmt.lib(exe_winmain.obj):错误LNK2019:无法parsing的外部符号_configure_narrow_argv在函数“int __cdecl pre_c_initialization(void)”中引用(?pre_c_initialization @@ YAHXZ)
 libcmt.lib(exe_winmain.obj):错误LNK2019:无法parsing的外部符号_get_narrow_winmain_command_line在函数“int __cdecl __scrt_common_main_seh(void)”中引用(?__ scrt_common_main_seh @@ YAHXZ)
 libcmt.lib(exe_winmain.obj):错误LNK2019:在函数“int __cdecl __scrt_common_main_seh(void)”中引用了无法parsing的外部符号_initterm(?__ scrt_common_main_seh @@ YAHXZ)
 ...
 libXpm.lib(rgb.obj):错误LNK2019:在函数xpmGetRGBfromName中引用的未parsing的外部符号strdup
 oldnames.lib(strdup.obj):错误LNK2001:无法parsing的外部符号strdup
 oldnames.lib(strdup.obj):错误LNK2001:无法parsing的外部符号_strdup
 gvim.exe:致命错误LNK1120:183无法parsing的外部 

我觉得我失去了一些明显的东西。 VS 2013和VS 2015之间有什么变化?

事实证明,这已经在vim_dev邮件列表中报告过,并且是由于C运行时的重新组织。

特别是,链接器的/nodefaultlib选项似乎导致了问题。

保罗·摩尔(Paul Moore)随访中包含的补丁对我有效。

Vim附带的预编译的XPM库似乎静态链接到MSVCRT。 CRT库特征中提到了这个问题:

如果您有多个DLL或EXE,那么您可能拥有多个CRT,无论您是否使用不同版本的Visual C ++。 例如,将CRT静态链接到多个DLL可能会导致同样的问题。 遇到与静态CRTs的这个问题的开发者已经被指示用/MD编译来使用CRT DLL。 现在,CRT DLL已被重命名为msvcr110.dll ,应用程序可能会有一些组件链接到msvcrt.dll和其他msvcr110.dll 。 如果您的DLL通过msvcrt.dllmsvcr110.dll边界传递CRT资源,您将遇到与CRT不匹配的问题,并需要使用Visual C ++重新编译您的项目。

我还没有尝试用VS2015重新编译包含的XPM库,所以现在在我的GVim中禁用了XPM支持。