2017-03-03 98 views
1

我们正在编制使用其中的文件,首先制作成目标文件泛型的软件,它们是建立像这样: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 

我的问题是: 我们是否需要在链接期间包含优化和警告标志?如果从对象文件创建flex二进制文件时包含-Wall,-Wextra和-O2,它会执行任何操作吗?

谢谢

编辑:根据反馈澄清意思。

+0

C中的泛型是编译时表达式。不知道为什么这是相关的。哪个“编译的最后阶段”?编译器运行在一个单一的过程(从用户视图) – Olaf

+0

我只是看到这是一个两步过程。构建目标文件然后组合目标文件。 –

+0

Build!=编译! – Olaf

回答

4

我们是否需要在编译的最后阶段包含优化和警告标志?

当然,你不需要需要包括他们的链接阶段。你已经知道,因为你不包括包括他们。但我认为你真正想知道的是...

如果在从目标文件构建flex二进制文件时包含-Wall,-Wextra和-O2,它会执行任何操作吗?

在编译阶段会生成所有或几乎所有警告。我不亲自知道任何例外情况,但可以想象有一些例外情况。因此,在链接过程中传递与警告相关的标志可能会触发警告,否则您不会收到警告。但是这不应该以任何方式影响编译的二进制文件。

优化是不同的。可以在链接时执行优化,但可能不会在默认优化级别执行。从链接命令中省略优化标记不应该破坏构建,但将它们包括在内可能会导致更快和/或更小的二进制文件。

总的来说,我没有理由避免在编译步骤中的链接步骤中传递相同的警告和优化标志。如果您愿意,也可以通过预处理程序特定的标志(例如-D),因为在链接期间它们将被忽略。我认为所有这些都是由make来管理的,所以并不是每次都需要输入选项。

+0

正确,我们正在使用make。谢谢。 –

0

NO您只需调用链接器,最后调用gcc和-W,-O标志用于编译器。

+0

这对于例如LTO。 – Olaf

-4

- 墙主要是一个预处理器选项,但也有一个库的参考。请参阅here

-Wextra似乎严格是C++预处理器选项。请参阅here

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

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

+2

既不是-Wall也不是-Wextra是预处理器选项。 – DyZ

+0

我认为-Wextra只有一些C++特性。我不相信它只是C++。 C++ only options can see [这里](https://gcc.gnu.org/onlinedocs/gcc/Option-Summary.html) –

+0

在帮助页面上,除了一个外,其他都与C++有关。指针与整数零与<, <=, >或> =进行比较。 (仅限C++)枚举器和非枚举器都出现在条件表达式中。 (仅限C++)不明确的虚拟基础。 (仅限C++)为已声明为register的数组下标。 (仅限C++)取得已声明寄存器的变量的地址。 (仅限C++)基类不在派生类的拷贝构造函数中初始化。 – netskink