这几天在把windows下的工程移植到centOS下的时候,发现gcc编译不过,有三点原因:
1、gcc相比VS,对C++标准的遵循更为严格,有些不符合标准的写法在VS下能过,但在gcc下则报错。比如:在头文件中声明类A的成员函数时,gcc下不能带有A::,又如初始化fstream时,gcc下第一个参数必须是const char *,而不能是string等等;
2、由于centOS已有的gcc4.4.7版本太低,一些C++11中的用法不支持;
3、同样由于gcc版本太低,几个开源的项目的静态库无法编译。
第1、2两点还好解决,但对于第三点总不能大改人家的开源项目,所以更新gcc到4.8.1,编译通过,生成了可执行文件。但坑爹的事情发生了,用gdb调试的时候,总是报错No symbol "XXXXX" in current context。
反复检查cmake里面设置了-g选项,说明gcc编译后产生了符号表,但为什么gdb总说找不到符号呢。百度、csdn没有一个答案有用,最后在stackoverflow上找到了原因:gcc升级后,gdb没有升级,新版本gcc产生的符号表低版本的gdb不认识,所以找不到符号。
解决方法有两个:
1、更新gdb;
2、GCC-4.8 defaults to using dwarf4 (gcc.gnu.org/gcc-4.8/changes.html), but GDB is too old to understand that. Build with
-gdwarf-2
, it will work!
也就是编译时将-g改为-gdwarf-2
。
参考:http://stackoverflow.com/questions/18407563/gcc-doesnt-produce-line-number-information-even-with-g-option