C++ 二进制对象文件在每次生成中都会更改
每次使用G++GNU编译器编译时,在不更改源代码的情况下,我都会得到一个不同的二进制对象文件。是否有一个编译选项每次都会给我相同的二进制文件。您最好使用。这样,如果源代码没有更改,编译将被跳过,因此对象文件不会更改 编辑:经过一些思考,可以使用makefile来处理您的注释,它将预处理和实际编译分离开来。还有一些肮脏的把戏 示例生成文件:C++ 二进制对象文件在每次生成中都会更改,c++,g++,C++,G++,每次使用G++GNU编译器编译时,在不更改源代码的情况下,我都会得到一个不同的二进制对象文件。是否有一个编译选项每次都会给我相同的二进制文件。您最好使用。这样,如果源代码没有更改,编译将被跳过,因此对象文件不会更改 编辑:经过一些思考,可以使用makefile来处理您的注释,它将预处理和实际编译分离开来。还有一些肮脏的把戏 示例生成文件: all: source source: source.i.cpp @cmp -s source.i.cpp source.i.prev || g++
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
请注意,可执行文件的时间已更改,但内容未更改(如果仅更改注释,而不是实际代码)。从GCC手册页复制: -frandom seed=string
此选项提供了GCC在需要时使用的种子 使用随机数。它是 用于生成某些必须不同的符号名称 在每个编译文件中。信息技术 还用于在覆盖率数据文件中放置唯一的戳记 以及生成的对象文件 他们。可以使用-frandom seed选项生成重复相同的对象文件 您编译的每个文件的字符串都应该不同
我正在更改源代码,但只是添加注释,而不是更改程序。你有解决这个问题的方法吗?实际上没有,更改源文件意味着重新编译:-(Make和其他构建工具不太聪明,无法理解只有注释被更改。扩展答案以涵盖你的案例:)我明白你的意思,但我想海报需要构建的可复制性。通常,编译器生成二进制等效数据并不重要。有些代码序列在逻辑上是等价的。编译器可以在周日选择一个,在周一选择另一个;随机定向优化器可以这样做,例如,基于最佳运行时搜索一组等价序列。等价基本块的排列可能是巨大的。没有什么可以说编译器必须产生相同的输出。这是一件特定编译器可以保证的好事。@artless noise:这里有一个相关问题。原则上,您是对的,编译器没有义务保证相同的源代码生成相同的编译代码,实际上需要做一些额外的工作来确保。的可能重复