使用CMake,且在GCC编译时指定相对源代码路径选项BUG的问题

本文探讨了CMake构建过程中GCC编译器如何处理调试信息中的路径,并介绍了如何通过修改CMakeLists.txt来禁用-fdebug-prefix-map选项,以避免GDB调试时源代码路径错误的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

CMake的build.make,每次都是cd xxx目录,然后再编译

 

而编译时,GCC会取当前路径保存进调试信息的DT_AT_comp_dir,GCC的编译器选项-fdebug-prefix-map=old=new,允许将路径做一个映射替换,比如将/usr/loca/src/gowork/src/kurento/kms-core/替换成./

同时DT_AT_name编译进的会是相应源代码文件的路径信息,也会受到-fdebug-prefix-map选项的影响。

如上例,最终编译的调试信息中,DT_AT_comp_dir会是./obj-x86_64-linux-gnu/src/gst-plugins/

而DT_AT_name会是./src/gst-plugins/kmscore.c。

GDB调试时,对于DT_AT_name是相对路径,会与DT_AT_comp_dir进行拼装,路径信息会拼装成./obj-x86_64-linux-gnu/src/gst-plugins/./src/gst-plugins/kmscore.c

就会出现源代码找不到的情况,这时候只能强制在编译时去除-fdebug-prefix-map选项,由于CMAKE在新版本的C_FLAGS默认就启用了-fdebug-prefix-map

因此只能在CMakeLists.txt中去除相应选项,类似如下代码,插入到合适位置(正则表达式不完善,各位可以自行调整)

STRING( REGEX REPLACE "\\-fdebug-prefix-map=[a-zA-Z0-9/=.\\-]*" " " CMAKE_C_FLAGS           ${CMAKE_C_FLAGS} )
STRING( REGEX REPLACE "\\-fdebug-prefix-map=[a-zA-Z0-9/=.\\-]*" " " CMAKE_CXX_FLAGS         ${CMAKE_CXX_FLAGS} )
STRING( REGEX REPLACE "\\-fdebug-prefix-map=[a-zA-Z0-9/=.\\-]*" " " CMAKE_C_FLAGS_DEBUG     ${CMAKE_C_FLAGS_DEBUG} )
STRING( REGEX REPLACE "\\-fdebug-prefix-map=[a-zA-Z0-9/=.\\-]*" " " CMAKE_CXX_FLAGS_DEBUG   ${CMAKE_CXX_FLAGS_DEBUG} )
STRING( REGEX REPLACE "\\-fdebug-prefix-map=[a-zA-Z0-9/=.\\-]*" " " CMAKE_C_FLAGS_RELEASE   ${CMAKE_C_FLAGS_RELEASE} )
STRING( REGEX REPLACE "\\-fdebug-prefix-map=[a-zA-Z0-9/=.\\-]*" " " CMAKE_CXX_FLAGS_RELEASE ${CMAKE_CXX_FLAGS_RELEASE} )

  

 

转载于:https://www.cnblogs.com/eaglexmw/p/10324671.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值