【问题标题】:Why am I not able to build Vim with Visual Studio 2015 RC command line tools?为什么我无法使用 Visual Studio 2015 RC 命令行工具构建 Vim?
【发布时间】:2015-07-11 06:26:31
【问题描述】:

昨天,我安装了Visual Studio 2015 RC Community Edition。作为第一个测试,我尝试从源代码构建 GVim。

我使用"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 file 此时未检测到新的 Visual Studio 版本。

在这之后,我有:

Framework40Version=v4.0
FrameworkDir=C:\Windows\Microsoft.NET\Framework64
FrameworkDIR64=C:\Windows\Microsoft.NET\Framework64
框架版本=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\\include\10.0.10056.0\ucrt;C:\Program Files (x86)\Windows Kits\8.1\include\shared;C:\Program Files (x86)\Windows Kits\8.1\include\um;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\
视觉工作室版本=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\

我能够构建一个简单的程序:

C:\...\Temp> 输入 t.c
#包括

诠释主要(无效){
    printf("你好 %s\n", "Stackoverflow.com");
    返回0;
}

C:\...\Temp> cl t.c
Microsoft (R) C/C++ 优化编译器版本 19.00.22816 for x64
版权所有 (C) 微软公司。版权所有。

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

/out:t.exe
t.obj

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

但是,当我发出构建 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: 无法解析的外部符号 memcmp
blowfish.obj : 错误 LNK2001: 无法解析的外部符号 memcmp
crypt.obj:错误 LNK2001:未解析的外部符号 memcmp
sha256.obj : 错误 LNK2001: 无法解析的外部符号 memcmp
undo.obj:错误 LNK2001:未解析的外部符号 memcmp
blowfish.obj:错误 LNK2019:函数 bf_e_cblock 中引用的未解析的外部符号 memcpy
winclip.obj:错误 LNK2001:未解析的外部符号 memcpy
screen.obj:错误 LNK2001:无法解析的外部符号 memcpy
sha256.obj:错误 LNK2001:未解析的外部符号 memcpy
gui.obj : 错误 LNK2001: 无法解析的外部符号 memmove
gui_w32.obj : 错误 LNK2001: 无法解析的外部符号 memmove
tag.obj : 错误 LNK2001: 无法解析的外部符号 memmove
term.obj:错误 LNK2001:未解析的外部符号 memmove
ui.obj:错误 LNK2001:无法解析的外部符号 memmove
undo.obj:错误 LNK2001:未解析的外部符号 memmove
screen.obj : 错误 LNK2001: 无法解析的外部符号 memmove
search.obj:错误 LNK2001:未解析的外部符号 memmove
spell.obj : 错误 LNK2001: 无法解析的外部符号 memmove
syntax.obj:错误 LNK2001:无法解析的外部符号 memmove
os_mswin.obj:错误 LNK2001:无法解析的外部符号 memmove
os_win32.obj:错误 LNK2001:无法解析的外部符号 memmove
quickfix.obj:错误 LNK2001:无法解析的外部符号 memmove
regexp.obj:错误 LNK2001:未解析的外部符号 memmove
misc2.obj:错误 LNK2001:未解析的外部符号 memmove
normal.obj:错误 LNK2001:未解析的外部符号 memmove
ops.obj:错误 LNK2001:无法解析的外部符号 memmove
option.obj:错误 LNK2001:无法解析的外部符号 memmove
memline.obj:错误 LNK2001:无法解析的外部符号 memmove
menu.obj:错误 LNK2001:无法解析的外部符号 memmove
message.obj:错误 LNK2001:未解析的外部符号 memmove
misc1.obj:错误 LNK2001:未解析的外部符号 memmove
getchar.obj:错误 LNK2001:未解析的外部符号 memmove
hashtab.obj:错误 LNK2001:无法解析的外部符号 memmove
mark.obj:错误 LNK2001:无法解析的外部符号 memmove
...
misc2.obj:错误 LNK2001:未解析的外部符号 fwrite
spell.obj : 错误 LNK2001: 无法解析的外部符号 fwrite
edit.obj:错误 LNK2019:函数 ins_ctrl_ey 中引用的未解析的外部符号 isalnum
regexp.obj:错误 LNK2001:未解析的外部符号 isalnum
ui.obj:错误 LNK2001:未解析的外部符号 strncpy
gui_w32.obj:错误 LNK2001:未解析的外部符号 strncpy
libXpm.lib(parse.obj):错误 LNK2001:未解析的外部符号 strncpy
libXpm.lib(data.obj):错误 LNK2001:未解析的外部符号 strncpy
regexp.obj:错误 LNK2001:未解析的外部符号 strncpy
screen.obj:错误 LNK2001:未解析的外部符号 strncpy
...
main.obj:错误 LNK2001:未解析的外部符号关闭
memfile.obj:错误 LNK2001:未解析的外部符号关闭
libXpm.lib(parse.obj) : error LNK2001: unresolved external symbol free
libXpm.lib(hashtab.obj):错误 LNK2001:未解析的外部符号免费
libXpm.lib(data.obj):错误 LNK2001:未解析的外部符号免费
libXpm.lib(misc.obj):错误 LNK2001:未解析的外部符号免费
...
eval.obj : error LNK2001: unresolved external symbol free
misc2.obj:错误 LNK2001:未解析的外部符号免费
os_win32.obj:错误 LNK2001:未解析的外部符号免费
gui_w32.obj:错误 LNK2001:未解析的外部符号免费
libcmt.lib(new_scalar.obj):错误 LNK2001:未解析的外部符号 malloc
libXpm.lib(simx.obj):错误 LNK2001:无法解析的外部符号 malloc
eval.obj:错误 LNK2001:未解析的外部符号 malloc
misc2.obj:错误 LNK2001:未解析的外部符号 malloc
os_win32.obj:错误 LNK2001:未解析的外部符号 malloc
gui_w32.obj:错误 LNK2001:未解析的外部符号 malloc
normal.obj:错误 LNK2001:未解析的外部符号 realloc
regexp.obj:错误 LNK2001:未解析的外部符号 realloc
libXpm.lib(simx.obj) : 错误 LNK2001: 无法解析的外部符号 realloc
eval.obj:错误 LNK2001:未解析的外部符号 realloc
memline.obj:错误 LNK2001:未解析的外部符号重新分配
misc1.obj:错误 LNK2001:未解析的外部符号 realloc
misc2.obj:错误 LNK2001:未解析的外部符号 realloc
...
ex_docmd.obj:错误 LNK2001:未解析的外部符号 stricmp
ops.obj:错误 LNK2001:无法解析的外部符号 __stdio_common_vfprintf
option.obj:错误 LNK2001:无法解析的外部符号 __stdio_common_vfprintf
search.obj:错误 LNK2001:无法解析的外部符号 __stdio_common_vfprintf
spell.obj : 错误 LNK2001: 无法解析的外部符号 __stdio_common_vfprintf
fold.obj:错误 LNK2001:未解析的外部符号 __stdio_common_vfprintf
getchar.obj:错误 LNK2001:无法解析的外部符号 __stdio_common_vfprintf
main.obj:错误 LNK2001:无法解析的外部符号 __stdio_common_vfprintf
mark.obj:错误 LNK2001:无法解析的外部符号 __stdio_common_vfprintf
eval.obj:错误 LNK2001:无法解析的外部符号 __stdio_common_vfprintf
ex_cmds.obj:错误 LNK2001:无法解析的外部符号 __stdio_common_vfprintf
ex_docmd.obj:错误 LNK2001:无法解析的外部符号 __stdio_common_vfprintf
ex_getln.obj:错误 LNK2001:未解析的外部符号 __stdio_common_vfprintf
window.obj:错误 LNK2001:无法解析的外部符号 __stdio_common_vsprintf
gui.obj:错误 LNK2001:未解析的外部符号 __stdio_common_vsprintf
gui_w32.obj : 错误 LNK2001: 无法解析的外部符号 __stdio_common_vsprintf
version.obj:错误 LNK2001:无法解析的外部符号 __stdio_common_vsprintf
spell.obj : 错误 LNK2001: 无法解析的外部符号 __stdio_common_vsprintf
syntax.obj:错误 LNK2001:无法解析的外部符号 __stdio_common_vsprintf
tag.obj:错误 LNK2001:无法解析的外部符号 __stdio_common_vsprintf
term.obj:错误 LNK2001:无法解析的外部符号 __stdio_common_vsprintf
regexp.obj:错误 LNK2001:未解析的外部符号 __stdio_common_vsprintf
screen.obj:错误 LNK2001:无法解析的外部符号 __stdio_common_vsprintf
search.obj:错误 LNK2001:无法解析的外部符号 __stdio_common_vsprintf
sha256.obj:错误 LNK2001:未解析的外部符号 __stdio_common_vsprintf
ops.obj:错误 LNK2001:未解析的外部符号 __stdio_common_vsprintf
option.obj:错误 LNK2001:无法解析的外部符号 __stdio_common_vsprintf
...
函数 _onexit 中引用的 _crt_atexit
libcmt.lib(utility.obj):错误 LNK2019:未解析的外部符号 _crt_at_quick_exit 在函数 at_quick_exit 中引用
libcmt.lib(utility.obj):错误 LNK2019:未解析的外部符号 _cexit 在函数 __scrt_dllmain_uninitialize_c 中引用
libcmt.lib(exe_winmain.obj):错误 LNK2001:无法解析的外部符号 _cexit
libcmt.lib(new_scalar.obj):错误 LNK2019:函数“void * __cdecl operator new(unsigned __int64)”(??2@YAPEAX_K@Z) 中引用的未解析外部符号 _callnewh
libcmt.lib(exe_winmain.obj):错误 LNK2019:未解析的外部符号 _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)”中引用的未解析外部符号 _set_app_type (?pre_c_initialization@@YAHXZ)
libcmt.lib(exe_winmain.obj):错误 LNK2019:函数“int __cdecl pre_c_initialization(void)”中引用的未解析的外部符号 __setusermatherr (?pre_c_initialization@@YAHXZ)
libcmt.lib(exe_winmain.obj):错误LNK2019:函数“int __cdecl pre_c_initialization(void)”(?pre_c_initialization@@YAHXZ)中引用的未解析的外部符号_configure_narrow_argv
libcmt.lib(exe_winmain.obj):错误 LNK2019:函数“int __cdecl __scrt_common_main_seh(void)”中引用的未解析的外部符号 _get_narrow_winmain_command_line (?__scrt_common_main_seh@@YAHXZ)
libcmt.lib(exe_winmain.obj):错误 LNK2019:函数“int __cdecl __scrt_common_main_seh(void)”中引用的未解析外部符号 _initterm (?__scrt_common_main_seh@@YAHXZ)
...
libXpm.lib(rgb.obj):错误 LNK2019:函数 xpmGetRGBfromName 中引用的未解析的外部符号 strdup
oldnames.lib(strdup.obj):错误 LNK2001:未解析的外部符号 strdup
oldnames.lib(strdup.obj):错误 LNK2001:未解析的外部符号 _strdup
gvim.exe : 致命错误 LNK1120: 183 unresolved externals

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

【问题讨论】:

    标签: c windows visual-studio vim visual-studio-2015


    【解决方案1】:

    事实证明这已经在vim_dev mailing list 上报告过,并且是由于重新组织了 C 运行时。

    具体来说,链接器的/nodefaultlib 选项似乎会导致问题。

    patch included in Paul Moore's follow-up 为我工作。

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

    如果您有多个 DLL 或 EXE,那么您可能有多个 CRT,无论您使用的是不同版本的 Visual C++。例如,将 CRT 静态链接到多个 DLL 可能会出现相同的问题。使用静态 CRT 遇到此问题的开发人员已被指示使用 /MD 进行编译以使用 CRT DLL。现在 CRT DLL 已重命名为 msvcr110.dll,应用程序可能有一些组件链接到 msvcrt.dll 和其他链接到 msvcr110.dll。如果您的 DLL 跨越 msvcrt.dllmsvcr110.dll 边界传递 CRT 资源,您将遇到 CRT 不匹配的问题,并且需要使用 Visual C++ 重新编译您的项目。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-13
      • 2021-04-20
      • 1970-01-01
      • 2015-11-14
      • 1970-01-01
      • 1970-01-01
      • 2015-12-29
      相关资源
      最近更新 更多