【问题标题】:How to link a static library to an executable using CMake如何使用 CMake 将静态库链接到可执行文件
【发布时间】:2015-04-16 16:03:46
【问题描述】:

在 CMake 中,我们使用 TARGET_LINK_LIBRARIES() 将共享库链接到库/可执行文件。

For example:
TARGET_LINK_LIBRARIES(ExecutableName xxx)
   where ExecutableName - is the name of executable
         xxx - is the library name.

据我了解,CMake 在 LINK_DIRECTORIES() 宏中提到的路径中搜索“libxxx.so”。 但是,如果我有一个名为“libxxx.a”的第三方库,那么如何使用 CMake 将该库链接到可执行文件。

提前感谢您的帮助!

【问题讨论】:

    标签: cmake


    【解决方案1】:

    您应该始终尝试为 target_link_libraries 提供完整路径或 CMake 目标。

    由于您似乎没有将依赖项构建为 CMake 项目的一部分,因此获取要链接的 CMake 目标的唯一方法是创建一个导入的目标。手动执行这通常非常乏味,因此除非依赖项已经提供了带有导入目标的配置文件,否则您可能不想走这条路。导入的目标是最方便使用的,但前提是您可以让 CMake 为您编写。

    那么,就是绝对路径。您显然不想在 CMakeLists 中硬编码绝对库路径。正如您在问题中指出的那样,所需的行为是您只指定库的名称,CMake 应该能够自动找出它的位置。这正是find_library 为您所做的。

    要链接到库 xxx,您可以执行以下操作:

    find_library(LIB_LOCATION xxx)
    target_link_libraries(ExecutableName ${LIB_LOCATION})
    

    请注意,find_library 提供了大量选项来进一步指定在何处查找请求的库。摆脱现有的link_directories 调用,并将相应的路径作为提示添加到find_library

    这种方法在将 CMake 代码移植到其他平台时更加灵活,并且在出现问题时比最初的方法更容易调试。

    【讨论】:

    • 如何告诉 find_library 去寻找静态库? find_library(CURL_LIBRARY_LIB_LOCATION curl) 仍然打印路径“/usr/lib/x86_64-linux-gnu/libcurl.so”。
    • @BTRNaidu 在这种情况下你应该give the full name of the library, including the .a。请注意,您可以提供多个名称来搜索 find_library。所以最终的命令看起来像:find_library(l NAMES libcurl.a curl)。我同意这不是最漂亮的解决方案,但它是目前告诉 CMake 如果您同时拥有静态和动态版本的唯一方法。
    【解决方案2】:

    只需指定库文件名即可:

    TARGET_LINK_LIBRARIES(ExecutableName libxxx.a)
    

    TARGET_LINK_LIBRARIES(ExecutableName xxx)
    

    实际上也应该可以工作,因为它不会在搜索路径中寻找 .so 而是寻找 libxxx.a 文件。

    【讨论】:

      猜你喜欢
      • 2010-12-07
      • 2018-12-28
      • 2021-06-16
      • 1970-01-01
      • 2013-06-24
      • 1970-01-01
      • 2017-02-24
      • 1970-01-01
      • 2015-10-08
      相关资源
      最近更新 更多