【发布时间】:2010-11-10 01:00:58
【问题描述】:
当我每次构建时使用 G++ GNU 编译器进行编译时,在不更改源代码的情况下,我会得到一个不同的二进制目标文件。是否有编译选项每次都会给我相同的二进制文件。
【问题讨论】:
当我每次构建时使用 G++ GNU 编译器进行编译时,在不更改源代码的情况下,我会得到一个不同的二进制目标文件。是否有编译选项每次都会给我相同的二进制文件。
【问题讨论】:
从 GCC 手册页复制:
-frandom-seed=字符串
此选项提供 GCC 使用的种子,否则 使用随机数。这是 用于生成某些必须不同的符号名称 在每个编译的文件中。它 也用于在覆盖数据文件中放置唯一的标记 以及产生的目标文件 他们。您可以使用 -frandom-seed 选项生成可重现的相同目标文件。您编译的每个文件的字符串应该不同。
【讨论】:
您最好使用make。这样,如果您的源没有更改,编译将被跳过,因此目标文件不会更改。
编辑:经过一番思考,可以使用将预处理和实际编译分开的 makefile 来解决您的评论。还有一些肮脏的把戏。
示例生成文件:
all: source
source: source.i.cpp
@cmp -s source.i.cpp source.i.prev || g++ source.i.cpp -o source
@touch source
@cp source.i.cpp source.i.prev
source.i.cpp: source.cpp
@g++ -E source.cpp >source.i.cpp
请注意可执行文件的时间已更改,但内容未更改(如果您仅更改了 cmets,而不是实际代码)。
【讨论】: