【问题标题】:Link static libraries to main project through imported target通过导入的目标将静态库链接到主项目
【发布时间】:2015-04-21 13:08:55
【问题描述】:

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

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

我设法在 Windows 上生成了适当的 Visual Studio 解决方案,但在 Linux 上却没有按预期工作。在构建解决方案时,我最终遇到了这个错误:

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

这是我的 CMakeLists.txt 中的一些代码 sn-ps。

Main 的 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 的 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)

我做错了什么?谢谢:)

【问题讨论】:

  • 是路径问题吗?此答案是否适用于您:stackoverflow.com/questions/14077611/…
  • 我不这么认为。我刚刚又检查了一遍,这些都是正确的绝对路径。
  • 如果你检查生成的 Makefile,你看到里面的绝对路径了吗?
  • 实际上你让我朝着正确的方向前进 :) 生成的 Makefile 中确实缺少这些库。我尝试设置 IMPORTED_LOCATION 而不是 IMPORTED_LOCATION_ 并解决了问题。我现在正在寻找一种方法来为调试和发布配置指定不同的库(例如在 Windows 上)。

标签: cmake


【解决方案1】:

我终于设法得到了我想要的,尽管我无法找到一种方法来获得适用于两个系统的方法。

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

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

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

感谢两位的帮助!

【讨论】:

    【解决方案2】:

    如果它适用于 Windows 而不是 Unix,那很可能是因为路径大小写:也就是说,您的文件夹名称中大小写字符的使用不一致。这在 Windows 中是可以容忍的,但在 Unix 中却是无情的惩罚:)

    解决方案:检查项目中thirdparty 的拼写方式(这里我看到thirdpartyThirdParty)。

    【讨论】:

    • 感谢您的回答!我已经仔细检查了每条路径,我很肯定,它们是正确的,即使考虑到套管陷阱(已经陷入其中:P)但是,问题似乎来自我正在使用的属性。 IMPORTED_LOCATION_DEBUG/RELEASE 导致 Third-NOTFOUND 错误。使用 IMPORTED_LOCATION 可以解决这个问题(虽然不能为不同的配置指定不同的库),但是将它们全部附加在 /CMakeFiles/Main.dir/link.txt -o "/libLib1. a;/libLib2.a;[...]" 这会导致找不到 lib 错误...
    • 删除双引号并用空格替换逗号可以解决问题。我现在正在寻找一种添加几个 IMPORTED_LOCATION 的方法(并且仍在寻找一种区分调试和发布配置的方法:))
    • @AlexandreZ。您是否指定构建类型?在 cmake 命令行中添加 -DCMAKE_BUILD_TYPE=Debug 或 -DCMAKE_BUILD_TYPE=Release 之类的内容(或从 cmake-gui 设置它,实际上更容易)。
    猜你喜欢
    • 1970-01-01
    • 2016-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-24
    • 2011-09-01
    • 1970-01-01
    相关资源
    最近更新 更多