gcc 使用 warning/optimization 标志链接目标文件

gcc linking object files with warning/optimization flags

我们正在使用泛型编译一个软件,其中文件首先被制成目标文件,它们是这样构建的:

arm-unknown-linux-gnu-gcc -c -O2 -Wstrict-prototypes -Wdeclaration-after-statement -fsigned-char -I/opt/tm-sdk/include  -mlittle-endian -Wno-trigraphs -fno-strict-aliasing -fno-omit-frame-pointer -march=armv4 -mtune=arm9tdmi -Wall -Wextra -o src/flex.o src/flex.c
...
arm-unknown-linux-gnu-gcc -c -O2 -Wstrict-prototypes -Wdeclaration-after-statement -fsigned-char -I/opt/tm-sdk/include  -mlittle-endian -Wno-trigraphs -fno-strict-aliasing -fno-omit-frame-pointer -march=armv4 -mtune=arm9tdmi -Wall -Wextra -o src/flexdb.o src/flexdb.c

然后它们链接到:

arm-unknown-linux-gnu-gcc -o flex src/flex.o src/flexdb.o src/flexio.o src/flexprotocol.o src/flexsettings.o src/flexstate.o -L/opt/tm-sdk/lib -ltag  -lrt -ltmreader -lsqlite3 -lsha1

我的问题是: 我们是否需要在链接期间包含优化和警告标志?如果在从目标文件创建 flex 二进制文件时包含 -Wall-Wextra-O2,它会做什么吗?

编辑:根据反馈澄清含义。

不,您只是通过对 gcc 的最终调用来调用链接器,-W 和 -O 标志用于编译器。

-Wall 主要是预处理器选项,但也有库的参考。参见 here

-Wextra 似乎是严格的 c++ 预处理器选项。参见 here

-O2 是编译器优化级别设置。参见 here

因此,为了准确回答您的问题,只有 -Wall 可能会在您的 link 步骤中提供帮助。其他两个不会。您可以通过使用和不使用这些选项进行构建来测试这一点,查看是否在出现警告的情况下创建了任何额外的输出,以及代码大小或执行时间在构建之间是否不同。

Do we need to include optimization and warning flags during this final stage of compilation?

当然,您不需要将它们包含在 link 阶段。您已经知道了,因为您包括它们。但我认为你真正想知道的是......

Would it do anything if -Wall, -Wextra, and -O2 were included when building the flex binary from object files.

所有或几乎所有的警告都是在编译阶段产生的。我不知道有什么例外,但可以想象有一些。因此,在 linking 期间传递与警告相关的标志可能会触发警告,否则您将不会收到这些警告。但这不应该以任何方式影响编译的二进制文件。

优化不同。有些优化可以在 link 时间执行,但可能不会在默认优化级别执行。从 link 命令中省略优化标志不会破坏您的构建,但包含它们可能会导致二进制文件更快和/或更小。

总的来说,我认为没有充分的理由避免在 link 步骤中传递您在编译步骤中执行的相同警告和优化标志。如果您愿意,传递特定于预处理器的标志(例如 -D)也没有害处,因为在 linking 期间它们将被忽略。我假设所有这些都是由 make 管理的,所以你实际上不需要每次都输入选项。