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
相关产品推荐
相关产品推荐

