每个可执行文件的不同链接器选项

时间:2018-10-17 11:07:54

标签: cmake linker

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

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

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)

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

如何实现?

2 个答案:

答案 0 :(得分:1)

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

  

set_target_properties(target1 target2 ...                         属性prop1 value1                         prop2 value2 ...)
  在目标上设置属性。
  ...
  有关CMake已知属性的列表,请参见“目标属性”。

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

  

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

     

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

因此使用类似以下内容的东西:

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

答案 1 :(得分:0)

虽然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