【问题标题】:Retrieve all link flags in CMake检索 CMake 中的所有链接标志
【发布时间】:2015-12-08 20:26:29
【问题描述】:

在 CMake 中,是否可以以编程方式检索将用于给定目标的链接器标志的完整列表?我能看到的唯一方法是检查目标的CMakeFiles 目录中的link.txt 文件。不理想。

我感兴趣的用例是收集数据以包含在 pkg-config 文件之类的文件中。我正在编写一个库,它包含几个使用该库的可执行实用程序。构建可执行文件(尤其是静态构建库时)需要一个重要的链接行来链接到我的库及其依赖项。所以我想写出将这些可执行文件构建到包中包含的数据文件所需的链接行,以便其他客户端可以知道如何链接。

【问题讨论】:

  • 如果您想要的不仅仅是目标的属性LINK_FLAGS 所提供的,您可能会面临列出所有链接目标的问题。参见,例如,this question。这个问题似乎无法在 CMake 脚本中解决。但是您可以尝试使用此属性的生成器表达式。它可以像使用INCLUDE_DIRECTORIES one 一样工作。
  • 可能的答案真的取决于你的动机。您能否详细介绍一下您想对这些标志做什么?例如。文档、错误跟踪、在其他地方重用,...
  • @Florian:好的,我用我的用例更新了问题。

标签: cmake


【解决方案1】:

正如@Tsyvarev 所评论的那样,CMake 中没有内置命令或属性“以编程方式检索链接器标志的完整列表”。

但受到您的提示的启发“所以我想写出将这些可执行文件构建到数据文件所需的链接行”我想我找到了一个可行的解决方案(至少对于 makefile 生成器) )。

如果我正确理解了您的要求,我们并不是在谈论像您这样简单的详细输出,例如CMAKE_VERBOSE_MAKEFILE,这仍然需要你手动复制。

所以考虑以下几点:

我想出使用我的ECHO“链接器”添加一个LinkLine 可执行文件,其唯一目的是创建我选择的链接行文件:

set(CMAKE_ECHO_STANDARD_LIBRARIES ${CMAKE_CXX_STANDARD_LIBRARIES})
set(CMAKE_ECHO_FLAGS ${CMAKE_CXX_FLAGS})
set(CMAKE_ECHO_LINK_FLAGS ${CMAKE_CXX_LINK_FLAGS})
set(CMAKE_ECHO_IMPLICIT_LINK_DIRECTORIES ${CMAKE_CXX_IMPLICIT_LINK_DIRECTORIES})
set(
    CMAKE_ECHO_LINK_EXECUTABLE 
    "<CMAKE_COMMAND> -E echo \"<FLAGS> <LINK_FLAGS> <LINK_LIBRARIES>\" > <TARGET>"
)

add_executable(LinkLine "")
target_link_libraries(LinkLine MyLibraryTarget)

set_target_properties(
    LinkLine 
        PROPERTIES
            LINKER_LANGUAGE ECHO
            SUFFIX          ".txt"
)

这种方法的好处是,我的LinkLine 目标的输出可以用作任何其他“官方生成”的可执行输出(例如在install() commands 或generator expressions 的构建后步骤中):

add_custom_command(
    TARGET LinkLine
    POST_BUILD
    COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:LinkLine> PackageCfg/$<TARGET_FILE_NAME:LinkLine>
)

参考文献

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-02
    • 1970-01-01
    • 1970-01-01
    • 2021-04-01
    • 2021-07-20
    • 2014-03-06
    • 1970-01-01
    相关资源
    最近更新 更多