通过导入的目标将静态库链接到主项目

时间:2015-04-21 13:08:56

标签: cmake

我在一个主项目上工作,有几个第三方库。我的目标是为了清楚起见将所有这些作为导入目标导入,但我无法使用它。它基本上是一组静态库( .lib / lib .a)及其标题。

为了便于讨论,Main是主要目标,第三是进口第三方。

我设法在Windows上生成一个合适的Visual Studio解决方案,但事情并没有按照预期在Linux上运行。在构建解决方案时,我最终得到了这个错误:

"No rule to make target 'Third-NOTFOUND', needed by '../Bin/Main'"

以下是我的CMakeLists.txt的一些代码段。

主要的CMakeLists.txt:

project(Main)
[...]
add_subdirectory(ThirdParty/Third)
set_property(TARGET Third PROPERTY FOLDER "thirdparty")
[...]
add_executable(Main ${SOURCES})
target_link_libraries(Main PRIVATE Third)

Third's CMakeLists.txt:

project(Third)
[...]
# Helper function
function(append_lib target lib_debug_dir lib_release_dir name)
    set_property(TARGET ${target} APPEND PROPERTY IMPORTED_LOCATION_DEBUG "${lib_debug_dir}/${LIB_NAME}")
    set_property(TARGET ${target} APPEND PROPERTY IMPORTED_LOCATION_RELEASE "${lib_release_dir}/${LIB_NAME}")
endfunction()
[...]
add_library(Third STATIC IMPORTED GLOBAL)
set_property(TARGET Third APPEND PROPERTY PROPERTY INTERFACE_INCLUDE_DIRECTORIES "${INCLUDE_DIR}")

append_lib(Third ${LIB_DIR_DEBUG} ${LIB_DIR_RELEASE} libMyLib1.a)

注意:Linux和Windows的代码是相同的,除了它自己的静态库的名称(MyLib1.lib替换libMyLib1.a)

我做错了什么?谢谢:))

2 个答案:

答案 0 :(得分:2)

我终于设法得到了我想要的东西,即使我找不到一种方法来获得适用于两个系统的方法。

在Windows上,我坚持我在问题中描述的内容。

但是在Linux上,我找到了一些解决方法。我将一个库导入为IMPORTED_LOCATION,将所有其他库导入为INTERFACE_LINK_LIBRARIES。这不是很好,但如果我没有指定导入的位置,我会收到第三次NOTFOUND错误。

正如Antonio所说,我使用CMAKE_BUILD_TYPE链接不同配置的不同库。

谢谢你们的帮助!

答案 1 :(得分:0)

如果它在Windows中而不是在Unix中运行,那很可能是因为路径大小写:即,在文件夹名称中使用大写和小写字符不一致。这在Windows中是可以容忍的,但在Unix中无情地受到惩罚:)

解决方案:检查您在项目周围拼写thirdparty的方式(在此处,我看到thirdpartyThirdParty)。