Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 二进制对象文件在每次生成中都会更改_C++_G++ - Fatal编程技术网

C++ 二进制对象文件在每次生成中都会更改

C++ 二进制对象文件在每次生成中都会更改,c++,g++,C++,G++,每次使用G++GNU编译器编译时,在不更改源代码的情况下,我都会得到一个不同的二进制对象文件。是否有一个编译选项每次都会给我相同的二进制文件。您最好使用。这样,如果源代码没有更改,编译将被跳过,因此对象文件不会更改 编辑:经过一些思考,可以使用makefile来处理您的注释,它将预处理和实际编译分离开来。还有一些肮脏的把戏 示例生成文件: all: source source: source.i.cpp @cmp -s source.i.cpp source.i.prev || g++

每次使用G++GNU编译器编译时,在不更改源代码的情况下,我都会得到一个不同的二进制对象文件。是否有一个编译选项每次都会给我相同的二进制文件。

您最好使用。这样,如果源代码没有更改,编译将被跳过,因此对象文件不会更改

编辑:经过一些思考,可以使用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

请注意,可执行文件的时间已更改,但内容未更改(如果仅更改注释,而不是实际代码)。

从GCC手册页复制:

-frandom seed=string
此选项提供了GCC在需要时使用的种子 使用随机数。它是 用于生成某些必须不同的符号名称 在每个编译文件中。信息技术 还用于在覆盖率数据文件中放置唯一的戳记 以及生成的对象文件 他们。可以使用-frandom seed选项生成重复相同的对象文件

您编译的每个文件的字符串都应该不同


我正在更改源代码,但只是添加注释,而不是更改程序。你有解决这个问题的方法吗?实际上没有,更改源文件意味着重新编译:-(Make和其他构建工具不太聪明,无法理解只有注释被更改。扩展答案以涵盖你的案例:)我明白你的意思,但我想海报需要构建的可复制性。通常,编译器生成二进制等效数据并不重要。有些代码序列在逻辑上是等价的。编译器可以在周日选择一个,在周一选择另一个;随机定向优化器可以这样做,例如,基于最佳运行时搜索一组等价序列。等价基本块的排列可能是巨大的。没有什么可以说编译器必须产生相同的输出。这是一件特定编译器可以保证的好事。@artless noise:这里有一个相关问题。原则上,您是对的,编译器没有义务保证相同的源代码生成相同的编译代码,实际上需要做一些额外的工作来确保。的可能重复