编译错误处理
gcc
Q:error C2059: 语法错误:”“ A:全局变量没有加分号,可能是复制粘贴导致的
Q:error: passing ‘const xx’ as ‘this’ argument discards qualifiers [-fpermissive]
A:调用const对象的非const方法报错,需要在方法声明和定义加const限定符
如string InetAddress::ip_ntoa() const {}
好的编程习惯,get类方法返回都加双重const
Q:Error: no such instruction: `shlx %rdx,(%r12),%rax’ A:shlx是新的intel指令,需要能支持这类新指令的汇编器,即binutils,centos6.x不行,而7.x版本可以支持 参考链接 https://blog.csdn.net/superbfly/article/details/59514207 https://blog.csdn.net/wang_xijue/article/details/47128649
Q:switch语句 jump to case label A:作用域问题,不要在case下定义语句或者将每个case语句块用{} 包起来
Q:编译gcc9报错config.log “unrecognized command line option ‘-V’” A:原因是较高版本的gcc不支持-V参数,修改环境变量,设置默认gcc为系统版本4.x,重新编译
Q:g : unrecognized option ‘-static-libstdc ’
A:gcc4.5才引入此选项,所以必须得gcc 4.8了;而centos 6.9默认的是4.4,所以只好换centos7.x来搞,默认4.8.5;最终使用的有效指令 ../configure --disable-checking --enable-languages=c,c --disable-multilib --prefix=/path/to/software/gcc9 --enable-threads=posix
Q:gcc9.1编译测试报错 /usr/bin/ld: unrecognized option ‘-plugin’ A:原因是binutils库太旧了(负责ld链接),升级binutils
Q:gcc9编译cpp报错 test.cpp:(.text 0xa): undefined reference to `std::cout’ A:换成g 或者gcc -lstdc
Q:list-initializer for non-class type must not be parenthesized A:发生在结构体构造函数对成员变量数组进行 ({0}) 初始化,改成 {} 会按照0来初始化
Q:Error: invalid operands of types ‘const char [35]’ and ‘const char [2]’ to binary ‘operator ’ A:不能直接对 const char 相加,使用string将最左侧的 char 转换为string即可
cmake
Q:Clock skew detected. Your build may be incomplete A:make报错,make clean & make
编译警告处理
[-Wreorder]
规则:构造函数时,初始化成员变量顺序要与类声明中顺序对应
warning: backslash and newline separated by space
连接字符串,后面多了空格
[-Wunused-parameter]
有些变量声明了但暂时未使用
可以注释掉;如果要保留,使用C 17语法 [[maybe_unused]] int a;
部分情况遇到 ‘mayebe_unused’ attribute directive ignored [-Wattributes]
[-Wsign-compare]
两种不同类型比较,主要是有符号无符号
解决方法比较多:
- 手动修改某一个类型
- decltype. 如
decltype(s.size()) len;
[-Wnarrowing]
类型转换,降级,如从int到short