You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CMake交叉编译arm-none-eabi时'-rdynamic'选项不识别,求移除方法

移除CMake交叉编译ARM时自动添加的'-rdynamic'选项

方法1:在工具链文件中全局禁用

CMake自动添加-rdynamic是因为默认会为支持动态符号导出的目标设置该选项,而ARM嵌入式目标通常不需要。在你的arm-none-eabi工具链文件中添加以下配置,彻底阻止CMake生成该选项:

# 清除C语言的动态符号导出标志
set(CMAKE_SHARED_LIBRARY_RUNTIME_C_FLAG "")
# 清除C++语言的动态符号导出标志
set(CMAKE_SHARED_LIBRARY_RUNTIME_CXX_FLAG "")

# 同时确保链接共享库时不附加该选项
set(CMAKE_SHARED_LIBRARY_LINK_C_FLAGS "")
set(CMAKE_SHARED_LIBRARY_LINK_CXX_FLAGS "")

方法2:在项目CMakeLists.txt中移除已添加的选项

如果工具链文件的配置未生效,或者需要针对特定项目调整,可以直接修改链接选项字符串,剔除-rdynamic:

# 处理C语言链接选项
string(REPLACE "-rdynamic" "" CMAKE_C_LINK_FLAGS "${CMAKE_C_LINK_FLAGS}")
# 处理C++语言链接选项
string(REPLACE "-rdynamic" "" CMAKE_CXX_LINK_FLAGS "${CMAKE_CXX_LINK_FLAGS}")

方法3:针对单个目标调整链接选项

如果只需要对特定可执行目标禁用-rdynamic,同时保留-Wl,-export-dynamic,可以在定义目标后设置属性:

add_executable(your_target main.c)
# 添加需要的导出动态符号选项
target_link_options(your_target PRIVATE "-Wl,-export-dynamic")
# 移除自动添加的-rdynamic
set_target_properties(your_target PROPERTIES LINK_FLAGS_RELEASE "$<REMOVE_FROM_LIST:-rdynamic>")
set_target_properties(your_target PROPERTIES LINK_FLAGS_DEBUG "$<REMOVE_FROM_LIST:-rdynamic>")

注意:优先使用方法1,因为它能覆盖CMake编译器检测阶段的测试程序(即你遇到的cmTC_803b3这类临时测试目标),从根源上避免该选项被添加。

内容的提问来源于stack exchange,提问作者atrixe144

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 04:48:14