检索CMake中的所有链接标志

Rob*_*bon 6 cmake

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

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

Flo*_*ian 5

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

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

如果我正确理解您的请求,我们并不是在谈论像您使用 eg 那样的简单详细输出CMAKE_VERBOSE_MAKEFILE,这仍然需要您手动复制内容。

因此,考虑以下因素:

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

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"
)
Run Code Online (Sandbox Code Playgroud)

这种方法的好处是,我的LinkLine目标的输出可以用作任何其他“正式生成的”可执行输出(例如,在带有生成器表达式的install()命令或构建后步骤中):

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

参考