【问题标题】:How can I add linker flag for libraries with CMake?如何使用 CMake 为库添加链接器标志?
【发布时间】:2014-08-23 08:19:18
【问题描述】:

链接二进制文件时,我可以使用CMAKE_EXE_LINKER_FLAGS 添加标志(比如说-Wl,-as-needed)。但是,如果我链接一个库,则不会考虑这个额外的标志。我需要CMAKE_LIB_LINKER_FLAGS 之类的东西,但我找不到。

我应该怎么做?

【问题讨论】:

  • 看看 CMakeCache.txt 文件。有各种 CMAKE_*_LINKER_FLAGS 变量(我目前没有 cmake,所以我无法检查)。选择你想要的

标签: cmake


【解决方案1】:

注意:现代 CMake 有比下面提到的更好的解决方案(有关详细信息,请参阅更新)。

您可以使用CMAKE_SHARED_LINKER_FLAGS 喜欢:

set (CMAKE_SHARED_LINKER_FLAGS "-Wl,--as-needed")

This question 看起来很相关。

UPD
感谢@Bruce Adams,他指出从 v3.13 开始,CMake 有 special command 用于此目的:add_link_options

UPD 2
感谢@Alex Reinking,他指出现代 CMake 不建议使用全局设置。建议在全局设置之前优先考虑属性设置,因此不应使用具有全局范围的add_link_options,而应使用target_link_options。有关详细信息,请参阅 Alex 的答案。

【讨论】:

  • 请注意,CMAKE_SHARED_LINKER_FLAGS 用于动态库。对于静态库,请改用 CMAKE_STATIC_LINKER_FLAGS。
  • 不要使用目录命令!!在 CMake 3.13+ 中,target_link_options 优于 add_link_options。详情请参阅我的回答。
  • @AlexReinking,感谢您的评论!我已经更新了答案并添加了这些信息。
  • LINK_WHAT_YOU_USE 呢?
【解决方案2】:

这是在现代 CMake (3.13+) 中向目标添加链接器标志的方式:

# my_tgt can be an executable, library, or module.
target_link_options(my_tgt PRIVATE "LINKER:-as-needed")

请注意,CMake 总是将标志传递给配置的编译器。因此,要将您的预期链接标志转发给链接器,您必须使用 LINKER: 前缀。 CMake 将负责将其扩展到 GCC 上的 -Wl,-as-needed 和 Clang 上的 -Xlinker -as-needed

在此处查看文档:https://cmake.org/cmake/help/latest/command/target_link_options.html

【讨论】:

    【解决方案3】:

    看起来这个问题与我在 CLION 中遇到的问题有关。我通过添加解决了它

    {set(CMAKE_CXX_STANDARD_LIBRARIES -ljpeg)}
    

    到 CMakeLists.txt。

    【讨论】:

    • 不要以这种方式使用这个变量。 The documentation明确指出“这个变量不应该由项目代码设置。它应该由CMake的设置当前工具链的平台信息模块,或与 CMAKE_TOOLCHAIN_FILE 一起使用时的工具链文件。"
    【解决方案4】:

    查看 ucmucm_add_linker_flags 宏 - 它处理将链接器标志附加到适当的 CMake 变量。

    【讨论】:

      【解决方案5】:

      在 CMake 3.10.2 中,建议的答案是 set (CMAKE_SHARED_LINKER_FLAGS "-Wl,--as-needed") 对我不起作用。我采用的解决方法是改用set_target_properties

      我的 CMakeLists.txt 文件有这样一行: add_library(libraryname MODULE a.cc b.cc c.cc)

      在那一行之后,我添加了这个: set_target_properties(libraryname PROPERTIES LINK_FLAGS "-Wl,-znodelete")

      【讨论】:

        【解决方案6】:

        请注意,您需要添加链接器选项没有“-Wl”,即:

        好:

        -DCMAKE_SHARED_LINKER_FLAGS="-fstack-protector"
        

        错误:

        -DCMAKE_SHARED_LINKER_FLAGS="-Wl,-fstack-protector"
        

        【讨论】:

          【解决方案7】:

          target_link_libraries(target-name PRIVATE -lexpat)

          我用它来链接我项目中的 XML 依赖项。将 -lexpat 替换为 -l(库名称)

          【讨论】:

            猜你喜欢
            • 2021-01-02
            • 2013-07-02
            • 2011-04-02
            • 1970-01-01
            • 2020-03-12
            • 2014-09-08
            相关资源
            最近更新 更多