昨天,我安装了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.dll
和msvcr110.dll
边界传递CRT资源,您将遇到与CRT不匹配的问题,并需要使用Visual C ++重新编译您的项目。
我还没有尝试用VS2015重新编译包含的XPM库,所以现在在我的GVim中禁用了XPM支持。