C -GCC使用警告/优化标志链接对象文件



我们正在使用仿制药来编译一块软件,其中首先将文件制成对象文件,它们像这样构建:

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

我的问题是:我们是否需要在链接过程中包括优化和警告标志?如果-Wall-Wextra-O2从对象文件创建FLEX二进制时,它会做任何事情吗?

编辑:根据反馈阐明含义。

我们需要在编译的最后阶段中包括优化和警告标志吗?

当然,您不需要将它们包括在链接阶段中。您已经知道这一点,因为您不包括它们。但是我认为您真正想知道的是...

如果构建对象文件构建flex二进制时,包括-wall,-wextra和-o2,它会执行任何操作。

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

优化是不同的。可以在链接时间执行一些优化,但是在默认优化级别上可能无法执行。从链接命令省略优化标志不应破坏您的构建,但包括它们可能会导致二进制更快和/或更小的二进制文件。

总的来说,我没有充分的理由避免在链接步骤中传递相同的警告和优化标志。如果您愿意,通过预处理器特定的标志(例如-D)也不有害,因为在链接过程中会被忽略。我假定所有这些都是由make管理的,所以这并不是您实际上都需要输入选项。

no,您只是在链接器上使用最终呼叫gcc和-w and -o flags来调用编译器。

-wall主要是预处理器选项,但库也有参考。请参阅此处

-wextra似乎严格来说是C 预处理器选项。请参阅此处

-O2是编译器优化级别设置。请参阅此处

为了回答您的确切问题,只有-wall可能会在您的链接步骤中有所帮助。另外两个不会。您可以通过有或没有这些选项进行构建来对此进行测试,查看在警告的情况下是否创建了任何其他输出,以及构建之间的代码大小或执行时间是否不同。

最新更新