【问题标题】:binary object file changing in each build在每个构建中更改二进制目标文件
【发布时间】:2010-11-10 01:00:58
【问题描述】:

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

【问题讨论】:

标签: c++ g++


【解决方案1】:

从 GCC 手册页复制:

-frandom-seed=字符串
此选项提供 GCC 使用的种子,否则 使用随机数。这是 用于生成某些必须不同的符号名称 在每个编译的文件中。它 也用于在覆盖数据文件中放置唯一的标记 以及产生的目标文件 他们。您可以使用 -frandom-seed 选项生成可重现的相同目标文件。

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

【讨论】:

    【解决方案2】:

    您最好使用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,而不是实际代码)。

    【讨论】:

    • 我正在更改源但只添加 cmets 不更改程序。你有这个案例的解决方案吗?
    • 其实不是,改源文件就意味着重新编译:-(make等构建工具没那么聪明理解,只改了cmets。
    • 扩展答案以涵盖您的情况:)
    • 我明白你的意思,但我认为发帖者希望建立可重复性。通常,编译器生成二进制等效数据通常并不重要。一些代码序列在逻辑上是等价的。编译器可以在周日选择一个,在周一选择另一个;一个随机定向的优化器可能会这样做,例如根据最佳运行时间搜索一组等价序列。等效基本块的排列可能是巨大的。没有什么可以说编译器必须产生相同的输出。这只是特定编译器可能保证的一件好事。
    • @artless 噪音:这里是an article 连接的问题。原则上你是对的,编译器没有义务保证相同的源代码产生相同的编译代码,实际上需要做一些额外的工作来确保这一点。
    猜你喜欢
    • 1970-01-01
    • 2010-09-18
    • 2020-01-08
    • 2013-10-30
    • 2015-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-05
    相关资源
    最近更新 更多