除了设置-Wall和设置之外-std=XXX,还有什么其他真正有用的,但是在C中使用的知名度较低的编译器标志?
我对任何其他警告特别感兴趣,和/或在某些情况下将警告转换为错误,以绝对最小化任何意外类型不匹配.
我想知道为什么gcc(4.6.3)没有给我这个例子中无法访问的代码的警告:
#include <stdio.h>
int status(void)
{
static int first_time = 1;
if (first_time) {
return 1;
first_time = 0; /* never reached */
} else {
return 0;
}
}
int main(int argc, const char *argv[])
{
printf("first call %d\n", status());
printf("second call %d\n", status());
return 0;
}
Run Code Online (Sandbox Code Playgroud)
注意,故障status()功能的目的是保持状态.我曾期望得到一个警告-Wall.我也试过了-Wunreachable-code,-Wextra(-pedantic和这里-ansi讨论的那样).然而,这些都没有给我一个警告.
看来gcc会默默地删除静态变量赋值.
在我看来,gcc选项-Wall -Werror应该抛出一个错误.
我的构建失败,出现以下链接器错误消息:
FAILED :: &&/usr/bin/g ++ -Wall -Wextra -Werror -g -fsanitize = undefined,address -Wno-unused-parameter -fsanitize = undefined,address -dynamic*.o -o SCE -Wl,-rpath,/opt/qt59/lib /opt/qt59/lib/libQt5Widgets.so.5.9.1 /usr/local/lib/libprotobuf.a -lpthread -lutil -lgrpc ++ /opt/qt59/lib/libQt5Gui.so.5.9.1 /opt/qt59/lib/libQt5Core.so.5.9.1&&:/
usr/bin/x86_64-linux-gnu-ld:无法识别的选项'--push-state - no-as-needed'
您可以在此处查看完整的构建日志.错误在第2211行,版本在第2104ff行打印.
哪个工具导致错误?
gcc 7.3.0使用了不正确的链接器标志?的ld文档表示--push-state和--no-as-needed是分开的命令.ld 2.28太老了解链接器标志?在更改日志没有列出任何似乎与.&& /usr/bin/g++看起来很奇怪,应该是/usr/bin/g++.使用make而不是ninja显示相同的链接错误.它正确地建立在其上使用Debian测试gcc 7.3.0以及和ld 2.30,但似乎没有成为一个工作binutils-2.30Ubuntu的忠实的PPA.
如何在Travis上成功构建我的项目?