跳到正文

GCC

共 2 篇 · 全部标签

构建配置与编译选项:警告集、优化档、标准版本,以及那些在本机是空操作的开关

实测:同一份带 3 处问题的源码,默认零警告、`-Wall` 报 1 条、`-Wall -Wextra` 2 条、再加 `-Wshadow` 3 条; `-Wall -Werror` 退出码 1 并打出 `[-Werror=unused-variable]`,而把它排在后面的 `-Wno-unused-variable` 一加就回到 0 (**最后一个赢**)。MinGW 上 `sizeof(wchar_t)=2`,加不加 `-fshort-wchar` 都一样;`(char)-1 > 0` 为 0(char 有符号)。 `-std` 档位读回:C 是 c89 无 `__STDC_VERSION__`、c99=199901、c11=201112、c17=201710、c2x=202000;C++ 是 c++11=201103…c++23=**202100**,而 `-std=c++2c` 直接 `unrecognized command-line option`。 `-fPIC`/`-fPIE`/`-fno-pic` 三个开关产出的 `.text` 与重定位数**逐字节相同**(x86-64 Windows 恒为 PIC)。 `-m32` 能编译出 `pe-i386` 的目标文件,但链接阶段一路 `skipping incompatible …libmingw32.a`。 调试信息:`-O0 -g3` 让 exe 从 77138 涨到 111720(`.debug*` 8 段 39220 字节),`-O2 -g` 只涨 3936 字节(9 段 7788)。

预处理、编译、汇编、链接

实测:26 行源码预处理后变 2012 行/114685 字节(180 倍);`-O2` 把 600 个函数从 62205 字节的 .o 压成 1480 字节(42 倍),可同一份小文件的 .o 反而比 -O0 大 29%——因为段从 7 个变成 10 个;`-ffinite-math-only` 把运行时的 `isnan()` 折成恒 0,而 `-Ofast` 走的是另一条路:它先把 `x/x` 简化成常量 1,NaN 根本不再产生。;`.txt` 后缀会被当成链接输入并以退出码 0 静默产出零个文件。