warning: implicit declaration of function 'execle' [-Wimplicit-function-declaration]
- 背景
使用GCC编译代码时遇到以下警告:
/home/TaskPackage/tools/kad_start_eab.c:102:2: warning: implicit declaration of function ‘execle’ [-Wimplicit-function-declaration]
if (execle("/backupsoft/AnyBackupServer/KADService/sbin/keepalived",
^
原因
(1)缺失头文件;
(2)函数名称错误
参考 StackOverflow 上的讨论。
- 解决办法
先用man指令查看该函数在哪个头文件下:
man execle
添加头文件后编译,问题解决。
总结:编译时遇到此类warning,首先找到报警的函数,再用man查看函数的头文件并添加到代码中即可。
warning: Comparison with string literal results in unspecified behaviour [-Wreorder]
- 背景
使用GCC编译代码时遇到以下警告:
/Nautilus/src/tools/nautilus_tools/MetaClient/include/Timer.hpp: In member function ‘double Timer::calculate(timepoint, timepoint, const char*)’:
/Nautilus/src/tools/nautilus_tools/MetaClient/include/Timer.hpp: 63:16: warning: comparison with string literal results in unspecified behaviour [-Waddress]
if ("s" == timetype) {
^
- 原因
在C ++中,== 仅在内部为原始类型(如int、char、bool...)实现,而 const char* 不是原始类型,因此const char* 和字符串会作为两个char* 比较,即两个指针的比较,而这是两个不同的指针,"s" == timetype 不可能为真。
参考 StackOverflow 上的讨论。
- 解决办法
1. 使用std::string
保存字符串,通过其"==" 运算符重载比较两字符串,无需获取指针;
2. 使用 strcmp 比较char*和const char*,字符串相等则返回0;
warning: 'xxx' will be initialized after [-Wreorder]
- 背景
使用GCC编译代码时遇到以下警告:
/home/Nautilus/thriftservice/ncNautilusThriftMgmHandler.h:91:39: warning: ‘ncNautilusThriftMgmHandler::_thriftservice’ will be initialized after [-Wreorder] ncThriftService* _thriftservice;
- 原因
构造函数时,初始化成员变量的顺序要与类声明中的变量顺序相对应,若不对应,则出现如题错误。解决方法就是按照顺序进行初始化。
对这个问题,StackOverflow上也有讨论。
warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
- 背景
使用GCC编译代码时遇到以下警告:
/home/Nautilus/thriftservice/ncNautilusThriftMgmHandler.cpp:100:33: warning: comparison between signed and unsigned integer expressions [-Wsign-compare] if(iplist.size() <= reconnectCont){ ^
- 原因
signed 和 unsigned 数据的范围不同,将无符号整数与有符号整数进行比较,会出现负的符号型的数据转化为很大的无符号型数据的现象。因为无符号整数在其极值处(即其最大值和最小值)会变得大于其有符号整数。基于此问题,编译器会发出警告。
iplist.size() 为size_t 类型,该类型定义在 cstddef 头文件(C标准库头文件 stddef.h 的C++版)中,它是一个与机器相关的 unsigned 类型,其大小足以保证存储内存中对象的大小。在用下标访问元素时,vector使用 vector::size_type 作为下标类型,而数组下标的正确类型则是size_t。
参考StackOverflow的讨论。
- 解决办法
1. 将 reconnectCont 定义为 size_t 或 size_type 类型;
2. 将 iplist.size() 强转为 int 类型;
warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
- 背景
今天在虚拟机上用GCC编译程序时,出现了下面的错误:
make[2]: warning: Clock skew detected. Your build may be incomplete
- 原因
试了make clean 后再 make,仍然是同样的问题,最后发现这个错误的原因在于系统时间比文件修改时间早(此前对虚拟机修改过系统时间),系统时间是 2021-12-16 00:52:13,而文件的修改时间则是 2012-12-16 15:58:12,于是将系统时间时间修改到文件修改时间之前,再重新编译,问题解决。
- 解决办法
Linux下用 date 命令可查询和修改系统时间(root权限才可修改)
1 date 查询系统时间 2 date -s 2021-12-16 命令可以修改系统日期 3 date -s 00:34:50 命令可以修改系统时间