带有静态/共享库的cmake项目中的错误LNK1181

时间:2018-03-12 07:38:48

标签: visual-c++ visual-studio-2015 cmake

我们正在尝试将我们的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})

这里有几个令人费解的事情:

  1. 为什么scanserver的构建正在寻找scanclient.lib?它被指示链接动态库而不是静态库
  2. 查看完整构建日志时,它构建的静态库似乎是scanclient32.lib。在文件名中执行的额外32是什么,即使是自动生成的,为什么链接器会查找scanclient.lib
  3. 构建在Linux和MacOS上成功,所以这个问题肯定是MSVC特有的。那么为什么链接失败以及如何解决?

    修改

    正如@Tsyvarev所建议的,我尝试删除静态扫描客户端库(请参阅this changeset),但错误仍然存​​在(请参见最底部的相应appveyor log)。

0 个答案:

没有答案
相关问题