使用CMake,且在GCC编译时指定相对源代码路径选项BUG的问题
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} )
使用CMake,且在GCC编译时指定相对源代码路径选项BUG的问题的更多相关文章
- gcc编译时指定链接库的查找目录
gcc编译时,如果需要链接的库的目录不在标准目录,则需要通过将保护库的目录/aa/bb/cc通过-L/aa/bb/cc 添加到搜索路径中,如: gcc -o xmltest xml_test.cpp ...
- gcc 编译时 include 搜索路径
这是一个不复杂的问题:但是网上很多回答都不全面:偶找了一个比较全面的(测试过): 引用http://blog.csdn.net/fjb2080/archive/2010/01/23/5247494.a ...
- gcc编译时对'xxxx'未定义的引用问题
gcc编译时对’xxxx’未定义的引用问题 gcc编译时对’xxxx’未定义的引用问题 原因 解决办法 gcc 依赖顺序问题 在使用gcc编译的时候有时候会碰到这样的问题,编译为.o(obj) 文件没 ...
- gcc编译时对’xxxx’未定义的引用问题
gcc编译时对’xxxx’未定义的引用问题 原因 解决办法 gcc 依赖顺序问题 在使用gcc编译的时候有时候会碰到这样的问题,编译为.o(obj) 文件没有问题,但是编译(这一步应该是链接)为可执行 ...
- clang在编译时指定目标文件所需的最低macOS版本
调研这个的原因,是因为有个同事在macOS 12.2上打包好的程序,放在macOS 10.15上运行时报错: Dyld Error Message: Symbol not found: __ZNKS ...
- gcc编译时头文件和库文件搜索路径
特殊情况:用户自定义的头文件使用#include"mylib"时,gcc编译器会从当前目录查找头文件 一.头文件 gcc 在编译时寻找所需要的头文件 : ※搜寻会从-I开始( ...
- linux gcc 编译时头文件和库文件搜索路径
一.头文件 gcc 在编译时寻找所需要的头文件 : ※搜寻会从-I开始 ※然后找gcc的环境变量 C_INCLUDE_PATH,CPLUS_INCLUDE_PATH,OBJC_INC ...
- gcc 编译时 库链接
gcc -l参数和-L参数 -l参数就是用来指定程序要链接的库,-l参数紧接着就是库名,那么库名跟真正的库文件名有什么关系呢?就拿数学库来说,他的库名是m,他的库文件名是libm.so,很容易看出,把 ...
- Linux使用gcc编译时设置编码格式
我们编写 C 程序时,可以使用 ANSI 编码,或是 UTF-8 编码:在编译程序时,可以使用以下的选项告诉编译器: -finput-charset=GB2312 -finput-charset=UT ...
随机推荐
- Babel 和 PostCss 的一些基本配置
Babel 是一个javascript编译器,PostCSS 是一个样式转换工具.两者都可以看作是一个转化平台,我们可以在上面使用一些插件,来达到想要的代码转化.几乎每个前端项目都要使用它们. Bab ...
- 在MVC5中使用Ninject 依赖注入
各大主流.Net的IOC框架性能测试比较 : http://www.cnblogs.com/liping13599168/archive/2011/07/17/2108734.html 使用NuGet ...
- Eclipse Support UTF-8
1. Windows > Preferences > General > Content Types, set UTF-8 as the default encoding for ...
- Linux之防火墙与端口
1.关闭所有的 INPUT FORWARD OUTPUT 只对某些端口开放.下面是命令实现: iptables -P INPUT DROPiptables -P FORWARD DROPiptable ...
- 【CodeForces】582 C. Superior Periodic Subarrays
[题目]C. Superior Periodic Subarrays [题意]给定循环节长度为n的无限循环数列,定义(l,s)表示起点为l的长度为s的子串,(l,s)合法要求将子串从该起点开始以s为循 ...
- 【BZOJ】1914: [Usaco2010 OPen]Triangle Counting 数三角形
[题意]给定坐标系上n个点,求能构成的包含原点的三角形个数,n<=10^5. [算法]极角排序 [题解]补集思想,三角形个数为C(n,3)-不含原点三角形. 将所有点极角排序. 对于一个点和原点 ...
- spring-retry 重试机制
业务场景 应用中需要实现一个功能: 需要将数据上传到远程存储服务,同时在返回处理成功情况下做其他操作.这个功能不复杂,分为两个步骤:第一步调用远程的Rest服务逻辑包装给处理方法返回处理结果:第二步拿 ...
- Perl6 Bailador框架(3):路径匹配
use v6; use Bailador; =begin pod 注意的是, 当/:one设置时 虽然你有/admin或/about, 但这个/:one不会跟现有的匹配 只跟没有的匹配: 也就是说, ...
- mysql cast函数
CAST函数语法规则是:Cast(字段名 as 转换的类型 ),其中类型可以为: CHAR[(N)] 字符型 DATE 日期型DATETIME 日期和时间型DECIMAL float型SIGNED i ...
- 获取并编译最新的Notepad++源码
获取并编译最新的Notepad++源码 http://blog.csdn.net/u012814856/article/details/68947310 Notepad++源码编译及其分析 http: ...