【问题标题】:Different linker options for each executable每个可执行文件的不同链接器选项
【发布时间】:2018-10-17 11:07:54
【问题描述】:

我想从相同的源文件创建两个单独的可执行文件,但链接器参数不同。

通过以上几行,我可以毫无问题地生成一个可执行文件:

set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} --specs=nano.specs -T libs.ld -T mem.ld -T sections.ld -L\"${CMAKE_CURRENT_SOURCE_DIR}/script\" -Wl,-Map,${MAP_NAME}")

add_executable(${ELF_NAME} ${PRJ1_SOURCE_FILES} ${PRJ1_HEADER_FILES})
target_link_libraries(${ELF_NAME} PRIVATE liba libb libc)

当我在上面的代码末尾添加以下两行时,除了第一个可执行文件之外,我可以很好地生成第二个可执行文件(具有相同的链接器标志):

add_executable(${ELF2_NAME} ${PRJ1_SOURCE_FILES} ${PRJ1_HEADER_FILES})
target_link_libraries(${ELF2_NAME} PRIVATE liba libb libc)

但我的问题是我必须生成具有不同链接器参数的第二个可执行文件(与第一个可执行文件同时)。我不想使用条件语句来生成一个接一个。我的目标是自动化这个过程。

如何做到这一点?

【问题讨论】:

    标签: cmake linker


    【解决方案1】:

    set_target_propertiesLINK_FLAGS 属性一起使用。来自set_target_properties manual

    set_target_properties(target1 target2 ... 属性 prop1 value1 prop2 值2 ...)
    在目标上设置属性。
    ...
    有关 CMake 已知的属性列表,请参阅 Targets 上的属性。

    在目标的链接属性中,我们可以找到LINK_FLAGS

    链接此目标时使用的其他标志。

    LINK_FLAGS 属性可用于向目标的链接步骤添加额外的标志。 LINK_FLAGS_ 将添加到配置中,例如,DEBUG、RELEASE、MINSIZEREL、RELWITHDEBINFO。

    所以使用类似的东西:

    set_target_properties(${ELF_NAME} PROPERTIES LINK_FLAGS " --specs=rdimon.specs")

    【讨论】:

      【解决方案2】:

      虽然目前 Kamil 的回答很好,但我相信您提出的问题在即将推出的 CMake v3.13 中得到了妥善解决。

      target_link_options 是为此目的而引入的,

      “指定链接给定目标时使用的链接选项。命名的必须是由 add_executable() 或 add_library() 等命令创建的,并且不能是 ALIAS 目标。”

      https://cmake.org/cmake/help/v3.13/command/target_link_options.html#command:target_link_options

      【讨论】:

        猜你喜欢
        • 2019-08-20
        • 2013-11-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多