我们正在尝试将我们的cmake项目3DTK移植到Windows,但遇到多个LNK1181错误。以下是其中一个的具体错误消息。可以从appveyor CI检索完整的错误日志。
"C:\slam6d\ALL_BUILD.vcxproj" (default target) (1) ->
"C:\slam6d\src\scanserver\scanserver.vcxproj" (default target) (115) ->
LINK : fatal error LNK1181: cannot open input file '..\..\obj\scanclient.lib' [C:\slam6d\src\scanserver\scanserver.vcxproj]
以下是CMakeLists.txt
的相关部分。完整版可在我们的svn here中找到。
[...]
add_library(scanclient_objects OBJECT ${CLIENT_SRCS})
# compile with -fPIC so that the result can be made into a shared library
set_property(TARGET scanclient_objects PROPERTY POSITION_INDEPENDENT_CODE 1)
add_library(scanclient_static STATIC $<TARGET_OBJECTS:scanclient_objects>)
add_library(scanclient_shared SHARED $<TARGET_OBJECTS:scanclient_objects>)
set_target_properties(scanclient_static PROPERTIES OUTPUT_NAME scanclient CLEAN_DIRECT_OUTPUT 1)
set_target_properties(scanclient_shared PROPERTIES OUTPUT_NAME scanclient CLEAN_DIRECT_OUTPUT 1)
set(CLIENT_LIBS ${Boost_LIBRARIES} pointfilter)
[...]
target_link_libraries(scanclient_static ${CLIENT_LIBS} ${Boost_FILESYSTEM_LIBRARY})
target_link_libraries(scanclient_shared ${CLIENT_LIBS} ${Boost_FILESYSTEM_LIBRARY})
[...]
add_executable(scanserver ${SERVER_SRCS})
set(SERVER_LIBS ${Boost_LIBRARIES} ${Boost_SYSTEM_LIBRARY} ${Boost_FILESYSTEM_LIBRARY} scanclient_shared scanio_shared)
[...]
target_link_libraries(scanserver ${SERVER_LIBS})
这里有几个令人费解的事情:
scanserver
的构建正在寻找scanclient.lib
?它被指示链接动态库而不是静态库scanclient32.lib
。在文件名中执行的额外32
是什么,即使是自动生成的,为什么链接器会查找scanclient.lib
?构建在Linux和MacOS上成功,所以这个问题肯定是MSVC特有的。那么为什么链接失败以及如何解决?
修改
正如@Tsyvarev所建议的,我尝试删除静态扫描客户端库(请参阅this changeset),但错误仍然存在(请参见最底部的相应appveyor log)。