Link 通过导入目标到主项目的静态库

Link static libraries to main project through imported target

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

为了方便讨论,Main是主要目标,Third是导入的第三方。

我设法在 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)

第三个 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)

我做错了什么?谢谢:)

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

解决方案:检查项目周围的 thirdparty 是如何拼写的(这里我看到 thirdpartyThirdParty)。

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

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

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

正如 Antonio 所建议的,我使用 CMAKE_BUILD_TYPE 到 link 不同配置的不同库。

谢谢两位的帮助!