Why can't I build Vim with Visual Studio 2015 RC Command Line Tools?
I installed Visual Studio 2015 Community Community Edition yesterday . As a first test, I tried to build GVim from source.
I opened a command window with "C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Visual Studio 2015\Visual Studio Tools\Windows Desktop Command Prompts\VS2015 x64 Native Tools Command Prompt.lnk"
, installed
set include=%include%;C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Include
so it Make_mvc.mak
takes the file Win32.mak
. Also, I installed:
set MSVCVER=12.0
as make file doesn't detect new version of Visual Studio at this point.
After that I have:
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 \\ 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 Platform = 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 \
I can create a simple program:
C: \ ... \ Temp> type tc #include int main (void) { printf ("Hello% s \ n", "Stackoverflow.com"); return 0; } C: \ ... \ Temp> cl tc Microsoft (R) C / C ++ Optimizing Compiler Version 19.00.22816 for x64 Copyright (C) Microsoft Corporation. All rights reserved. tc Microsoft (R) Incremental Linker Version 14.00.22816.0 Copyright (C) Microsoft Corporation. All rights reserved. /out:t.exe t.obj C: \ ... \ Temp> t.exe Hello Stackoverflow.com
However, when I issue the command to build my GVim (which works great with Visual Studio 2013 CE tools), the compilation goes well, but I get the following link errors:
C: \ ... \ vim \ src> nmake -f Make_mvc.mak CPU = AMD64 OPTIMIZE = SPACE GETTEXT = no NETBEANS = no CSCOPE = no DIRECTX = yes GUI = yes
I am discarding most of the error messages because there are a lot of them:
gui_dwrite.obj: error LNK2001: unresolved external symbol memcmp blowfish.obj: error LNK2001: unresolved external symbol memcmp crypt.obj: error LNK2001: unresolved external symbol memcmp sha256.obj: error LNK2001: unresolved external symbol memcmp undo.obj: error LNK2001: unresolved external symbol memcmp blowfish.obj: error LNK2019: unresolved external symbol memcpy referenced in function bf_e_cblock winclip.obj: error LNK2001: unresolved external symbol memcpy screen.obj: error LNK2001: unresolved external symbol memcpy sha256.obj: error LNK2001: unresolved external symbol memcpy gui.obj: error LNK2001: unresolved external symbol memmove gui_w32.obj: error LNK2001: unresolved external symbol memmove tag.obj: error LNK2001: unresolved external symbol memmove term.obj: error LNK2001: unresolved external symbol memmove ui.obj: error LNK2001: unresolved external symbol memmove undo.obj: error LNK2001: unresolved external symbol memmove screen.obj: error LNK2001: unresolved external symbol memmove search.obj: error LNK2001: unresolved external symbol memmove spell.obj: error LNK2001: unresolved external symbol memmove syntax.obj: error LNK2001: unresolved external symbol memmove os_mswin.obj: error LNK2001: unresolved external symbol memmove os_win32.obj: error LNK2001: unresolved external symbol memmove quickfix.obj: error LNK2001: unresolved external symbol memmove regexp.obj: error LNK2001: unresolved external symbol memmove misc2.obj: error LNK2001: unresolved external symbol memmove normal.obj: error LNK2001: unresolved external symbol memmove ops.obj: error LNK2001: unresolved external symbol memmove option.obj: error LNK2001: unresolved external symbol memmove memline.obj: error LNK2001: unresolved external symbol memmove menu.obj: error LNK2001: unresolved external symbol memmove message.obj: error LNK2001: unresolved external symbol memmove misc1.obj: error LNK2001: unresolved external symbol memmove getchar.obj: error LNK2001: unresolved external symbol memmove hashtab.obj: error LNK2001: unresolved external symbol memmove mark.obj: error LNK2001: unresolved external symbol memmove ... misc2.obj: error LNK2001: unresolved external symbol fwrite spell.obj: error LNK2001: unresolved external symbol fwrite edit.obj: error LNK2019: unresolved external symbol isalnum referenced in function ins_ctrl_ey regexp.obj: error LNK2001: unresolved external symbol isalnum ui.obj: error LNK2001: unresolved external symbol strncpy gui_w32.obj: error LNK2001: unresolved external symbol strncpy libXpm.lib (parse.obj): error LNK2001: unresolved external symbol strncpy libXpm.lib (data.obj): error LNK2001: unresolved external symbol strncpy regexp.obj: error LNK2001: unresolved external symbol strncpy screen.obj: error LNK2001: unresolved external symbol strncpy ... main.obj: error LNK2001: unresolved external symbol close memfile.obj: error LNK2001: unresolved external symbol close libXpm.lib (parse.obj): error LNK2001: unresolved external symbol free libXpm.lib (hashtab.obj): error LNK2001: unresolved external symbol free libXpm.lib (data.obj): error LNK2001: unresolved external symbol free libXpm.lib (misc.obj): error LNK2001: unresolved external symbol free ... eval.obj: error LNK2001: unresolved external symbol free misc2.obj: error LNK2001: unresolved external symbol free os_win32.obj: error LNK2001: unresolved external symbol free gui_w32.obj: error LNK2001: unresolved external symbol free libcmt.lib (new_scalar.obj): error LNK2001: unresolved external symbol malloc libXpm.lib (simx.obj): error LNK2001: unresolved external symbol malloc eval.obj: error LNK2001: unresolved external symbol malloc misc2.obj: error LNK2001: unresolved external symbol malloc os_win32.obj: error LNK2001: unresolved external symbol malloc gui_w32.obj: error LNK2001: unresolved external symbol malloc normal.obj: error LNK2001: unresolved external symbol realloc regexp.obj: error LNK2001: unresolved external symbol realloc libXpm.lib (simx.obj): error LNK2001: unresolved external symbol realloc eval.obj: error LNK2001: unresolved external symbol realloc memline.obj: error LNK2001: unresolved external symbol realloc misc1.obj: error LNK2001: unresolved external symbol realloc misc2.obj: error LNK2001: unresolved external symbol realloc ... ex_docmd.obj: error LNK2001: unresolved external symbol stricmp ops.obj: error LNK2001: unresolved external symbol __stdio_common_vfprintf option.obj: error LNK2001: unresolved external symbol __stdio_common_vfprintf search.obj: error LNK2001: unresolved external symbol __stdio_common_vfprintf spell.obj: error LNK2001: unresolved external symbol __stdio_common_vfprintf fold.obj: error LNK2001: unresolved external symbol __stdio_common_vfprintf getchar.obj: error LNK2001: unresolved external symbol __stdio_common_vfprintf main.obj: error LNK2001: unresolved external symbol __stdio_common_vfprintf mark.obj: error LNK2001: unresolved external symbol __stdio_common_vfprintf eval.obj: error LNK2001: unresolved external symbol __stdio_common_vfprintf ex_cmds.obj: error LNK2001: unresolved external symbol __stdio_common_vfprintf ex_docmd.obj: error LNK2001: unresolved external symbol __stdio_common_vfprintf ex_getln.obj: error LNK2001: unresolved external symbol __stdio_common_vfprintf window.obj: error LNK2001: unresolved external symbol __stdio_common_vsprintf gui.obj: error LNK2001: unresolved external symbol __stdio_common_vsprintf gui_w32.obj: error LNK2001: unresolved external symbol __stdio_common_vsprintf version.obj: error LNK2001: unresolved external symbol __stdio_common_vsprintf spell.obj: error LNK2001: unresolved external symbol __stdio_common_vsprintf syntax.obj: error LNK2001: unresolved external symbol __stdio_common_vsprintf tag.obj: error LNK2001: unresolved external symbol __stdio_common_vsprintf term.obj: error LNK2001: unresolved external symbol __stdio_common_vsprintf regexp.obj: error LNK2001: unresolved external symbol __stdio_common_vsprintf screen.obj: error LNK2001: unresolved external symbol __stdio_common_vsprintf search.obj: error LNK2001: unresolved external symbol __stdio_common_vsprintf sha256.obj: error LNK2001: unresolved external symbol __stdio_common_vsprintf ops.obj: error LNK2001: unresolved external symbol __stdio_common_vsprintf option.obj: error LNK2001: unresolved external symbol __stdio_common_vsprintf ... _crt_atexit referenced in function _onexit libcmt.lib (utility.obj): error LNK2019: unresolved external symbol _crt_at_quick_exit referenced in function at_quick_exit libcmt.lib (utility.obj): error LNK2019: unresolved external symbol _cexit referenced in function __scrt_dllmain_uninitialize_c libcmt.lib (exe_winmain.obj): error LNK2001: unresolved external symbol _cexit libcmt.lib (new_scalar.obj): error LNK2019: unresolved external symbol _callnewh referenced in function "void * __cdecl operator new (unsigned __int64)" ( ?? 2 @ YAPEAX _K @ Z ) libcmt.lib (exe_winmain.obj): error LNK2019: unresolved external symbol _seh_filter_exe referenced in function "int` int __cdecl __scrt_common_main_seh (void) ':: `1' :: filt $ 0" ( ? filt $ 0 @ ? 0 ?? __ scrt_seh @ filtm @ YAHXZ @ 4HA ) libcmt.lib (exe_winmain.obj): error LNK2019: unresolved external symbol _set_app_type referenced in function "int __cdecl pre_c_initialization (void)" ( ? pre_c_initialization @ @YAHXZ) libcmt.lib (exe_winmain.obj): error LNK2019: unresolved external symbol __setusermatherr referenced in function "int __cdecl pre_c_initialization (void)" ( ? pre_c_initialization @ @YAHXZ) libcmt.lib (exe_winmain.obj): error LNK2019: unresolved external symbol _configure_narrow_argv referenced in function "int __cdecl pre_c_initialization (void)" ( ? pre_c_initialization @ @YAHXZ) libcmt.lib (exe_winmain.obj): error LNK2019: unresolved external symbol _get_narrow_winmain_command_line referenced in function "int __cdecl __scrt_common_main_seh (void)" ( ? __ scrt_common_main_seh) @ @YAHXZ libcmt.lib (exe_winmain.obj): error LNK2019: unresolved external symbol _initterm referenced in function "int __cdecl __scrt_common_main_seh (void)" ( ? __ scrt_common_main_seh @ @YAHXZ) ... libXpm.lib (rgb.obj): error LNK2019: unresolved external symbol strdup referenced in function xpmGetRGBfromName oldnames.lib (strdup.obj): error LNK2001: unresolved external symbol strdup oldnames.lib (strdup.obj): error LNK2001: unresolved external symbol _strdup gvim.exe: fatal error LNK1120: 183 unresolved externals
I feel like I am missing something obvious. What has changed between VS 2013 and VS 2015?
source to share
It turns out this has already been reported on the vim_dev mailing list and it has to do with a refactoring of the C runtime.
In particular, the parameter /nodefaultlib
for the linker seems to be causing the problem.
The patch included in Pavel Moore's observation worked for me.
The pre-compiled XPM library included with Vim seems to be statically linked to MSVCRT. This issue is mentioned in CRT Library Functions :
If you have multiple DLLs or EXEs, you can have multiple CRTs, regardless of whether you are using different versions of Visual C ++. For example, statically linking a CRT to multiple DLLs can present the same problem. Developers facing this issue with static CRTs have been instructed to compile with a
/MD
DLL CRT to use. Now that the CRT DLL has been renamed tomsvcr110.dll
, applications can have some components associated withmsvcrt.dll
and others withmsvcr110.dll
. If your DLLs are passing CRT resources on the bordermsvcrt.dll
andmsvcr110.dll
, you will run into inconsistent CRT issues and must recompile your project with Visual C ++.
I have not tried to recompile the included XPM library using VS2015, so XPM support in my GVim is now disabled.
source to share