如何在CMake中移除目标的顶层链接选项?
解决CMake可重定位目标避免继承全局链接选项的方案
针对你的场景,有三种可行方法,无需修改顶层配置即可让特殊的可重定位目标跳过或移除不需要的全局链接选项:
方法一:完全重置目标的链接选项
直接清空可重定位目标继承的全局链接选项,仅保留自定义选项。修改可重定位目标的配置如下:
#relocatable target add_executable(relocatable-target #some sources here ) set_target_properties(relocatable-target PROPERTIES SUFFIX ".out" ENABLE_EXPORTS on LINK_OPTIONS "" # 清空从顶层继承的所有链接选项 ) # 添加自定义链接选项 target_link_options(relocatable-target PRIVATE # 这里放你的专属链接选项,比如针对可重定位模块的选项 "-Wl,--relocatable" # 其他需要的选项... )
这个方法最直接,适合不需要任何顶层链接选项的场景。
方法二:移除特定的不需要选项
如果部分顶层链接选项仍需保留,仅移除-Wl,--ram_model和-Wl,-e_vectors,可以通过过滤目标的LINK_OPTIONS属性实现:
#relocatable target add_executable(relocatable-target #some sources here ) set_target_properties(relocatable-target PROPERTIES SUFFIX ".out" ENABLE_EXPORTS on ) # 获取当前目标继承的所有链接选项 get_target_property(current_link_opts relocatable-target LINK_OPTIONS) # 移除不需要的选项 string(REPLACE "-Wl,--ram_model" "" filtered_opts "${current_link_opts}") string(REPLACE "-Wl,-e_vectors" "" filtered_opts "${filtered_opts}") # 清理多余空格 string(STRIP "${filtered_opts}" filtered_opts) # 重新设置过滤后的选项 set_target_properties(relocatable-target PROPERTIES LINK_OPTIONS "${filtered_opts}" ) # 添加自定义链接选项 target_link_options(relocatable-target PRIVATE # 你的专属链接选项 )
这种方式保留了顶层的其他有用选项(比如-Wl,--reread_libs和-Wl,--diag_suppress=10063),仅剔除会导致错误的选项。
方法三:临时暂停全局链接选项再恢复
在创建可重定位目标前,暂时清空全局链接选项,创建完成后恢复原有配置,确保目标不会继承任何全局选项:
# 保存当前全局链接选项 get_property(original_global_link_opts GLOBAL PROPERTY LINK_OPTIONS) # 临时清空全局链接选项 set_property(GLOBAL PROPERTY LINK_OPTIONS "") # 创建可重定位目标 add_executable(relocatable-target #some sources here ) # 恢复全局链接选项,不影响后续其他目标 set_property(GLOBAL PROPERTY LINK_OPTIONS "${original_global_link_opts}") set_target_properties(relocatable-target PROPERTIES SUFFIX ".out" ENABLE_EXPORTS on ) # 添加自定义链接选项 target_link_options(relocatable-target PRIVATE # 你的专属链接选项 )
这个方法适合需要完全隔离全局配置的场景,确保目标不受任何顶层链接选项影响。
注意:三种方法都不会修改顶层的add_link_options配置,主目标和其他静态库仍会正常继承全局链接选项,不会受到影响。
内容的提问来源于stack exchange,提问作者NetoBF
相关产品推荐
相关产品推荐

