2013-11-14 53 views
0

我使用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") 

即添加所需的库明确,让我成功地构建软件包,链接但是,呃警告依然存在,这当然只是一种解决方法,但对于这个问题并没有令人满意的解决方案。

回答

0

您应该将库添加到openmpi cmake文件并且不要更改CMake文件。而且你不应该改变CMake发行版文件,而是修复伴随你试图构建的库的文件。大多数情况下,这是一个图书馆的错误,而不是CMake的错误。

+0

问题不在于项目CMakeLists.txt文件缺少库引用(它们以“TARGET_LINK_LIBRARIES(... Ws2_32.lib shlwapi.lib ...)”设置[...为简洁起见添加]) ,但是它们被传递给链接命令,其前缀为'/ l',即,分别为'/lWs"_32.lib'和'/lshlwapi.lib',导致链接器警告,从而导致这些链接库如上所述,修改CMake发布文件只是一个不尽人意的解决方法 – rinkydink

+0

此外,在上面的回复中,使用Visual Studio 2010/vc10环境完美运行,因此,我很想假设vc11工具集的某些配置无法正常工作。 – rinkydink