我使用Windows 7 64bit上的CMake(2.8.11.2)为openmpi 1.4.3软件包配置并生成了nmake生成文件。我正在使用“VS2012 x64交叉工具命令提示符”。不幸的是,第一个DLL目标的链接步骤失败了,因为一些traget库以'/ l'前缀添加到链接命令行中,导致链接器发出警告,但结果在未解析的外部符号中,因为所需的库具有被忽略。即Visual Studio 2012中的CMake/NMake链接错误/ vc11
Linking C shared library ..\liblibopen-pal.dll
cd C:\home\re04179\thirdparty\openmpi-1.4.3-build\vc11\x64\release\opal
"C:\Program Files (x86)\CMake 2.8\bin\cmake.exe" -E vs_link_dll C:\PROGRA~2\MICROS~1.0\VC\bin\X86_AM~1\link.exe /nologo @CMakeFiles\libopen-pal.dir\objects1.rsp @C:\Users\RE04179\AppData\Local\Temp\nm1B31.tmp
Visual Studio Non-Incremental Link
LINK:
C:\PROGRA~2\MICROS~1.0\VC\bin\X86_AM~1\link.exe /nologo @CMakeFiles\libopen-pal.dir\objects1.rsp /out:..\liblibopen-pal.dll /implib:..\liblibopen-pal.dll.a /pdb:C:\home\re04179\thirdparty\openmpi-1.4.3-build\vc11\x64\release\liblibopen-pal.pdb /dll /version:0.0 /machine:x64 /INCREMENTAL:NO -lWs2_32.lib -lshlwapi.lib kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib /MANIFEST
LINK : warning LNK4044: unrecognized option '/lWs2_32.lib'; ignored
LINK : warning LNK4044: unrecognized option '/lshlwapi.lib'; ignored
Creating library ..\liblibopen-pal.dll.a and object ..\liblibopen-pal.dll.exp
win32.obj : error LNK2019: unresolved external symbol __imp_WSAGetLastError referenced in function win32_insert
evutil.obj : error LNK2001: unresolved external symbol __imp_WSAGetLastError
if.obj : error LNK2001: unresolved external symbol __imp_WSAGetLastError
win32.obj : error LNK2019: unresolved external symbol __imp_WSACloseEvent referenced in function win32_del
win32.obj : error LNK2019: unresolved external symbol __imp_WSACreateEvent referenced in function win32_recompute_event
win32.obj : error LNK2019: unresolved external symbol __imp_WSAEnumNetworkEvents referenced in function win32_socket_event_callback
win32.obj : error LNK2019: unresolved external symbol __imp_WSAEventSelect referenced in function win32_del
win32.obj : error LNK2019: unresolved external symbol __imp_WSAHtonl referenced in function win32_insert
等
通过编辑线156文件的 'C:\ Program Files文件(x86)的\ CMake的2.8 \共享\的cmake-2.8 \模块\平台\ Windows的MSVC.cmake' 从
set(CMAKE_C_STANDARD_LIBRARIES_INIT "kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib")
到
set(CMAKE_C_STANDARD_LIBRARIES_INIT "ws2_32.lib shlwapi.lib kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib")
即添加所需的库明确,让我成功地构建软件包,链接但是,呃警告依然存在,这当然只是一种解决方法,但对于这个问题并没有令人满意的解决方案。
问题不在于项目CMakeLists.txt文件缺少库引用(它们以“TARGET_LINK_LIBRARIES(... Ws2_32.lib shlwapi.lib ...)”设置[...为简洁起见添加]) ,但是它们被传递给链接命令,其前缀为'/ l',即,分别为'/lWs"_32.lib'和'/lshlwapi.lib',导致链接器警告,从而导致这些链接库如上所述,修改CMake发布文件只是一个不尽人意的解决方法 – rinkydink
此外,在上面的回复中,使用Visual Studio 2010/vc10环境完美运行,因此,我很想假设vc11工具集的某些配置无法正常工作。 – rinkydink