检索CMake中的所有链接标志

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

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

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

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

如果我正确地理解了您的请求,我们就不会像您一样谈论简单的详细输出. CMAKE_VERBOSE_MAKEFILE,仍然需要你手动复制东西.

因此,请考虑以下因素:

>您需要先运行生成器才能获得真正的链接线
> CMake允许您按名称发明任何链接器语言
>您可以使用变量和expansion rules定义与CMAKE_>LANG<_LINK_EXECUTABLE的链接线

我想出了使用我的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() commandsgenerator expressions的后构建步骤):

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

参考

> Recursive list of LINK_LIBRARIES in CMake
> add_custom_command is not generating a target

点赞