相关疑难解决方法(0)

C的有用GCC标志

除了设置-Wall和设置之外-std=XXX,还有什么其他真正有用的,但是在C中使用的知名度较低的编译器标志?

我对任何其他警告特别感兴趣,和/或在某些情况下将警告转换为错误,以绝对最小化任何意外类型不匹配.

c gcc compiler-flags

154
推荐指数
18
解决办法
6万
查看次数

为什么GCC没有警告无法访问的代码?

我想知道为什么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应该抛出一个错误.

c gcc static-variables gcc-warning

15
推荐指数
2
解决办法
3048
查看次数

ld:无法识别的选项'--push-state - no-as-needed'

我的构建失败,出现以下链接器错误消息:

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上成功构建我的项目?

gcc linker-errors ld ubuntu-14.04

8
推荐指数
1
解决办法
2970
查看次数