Я пытаюсь сделать так, чтобы две разные машины производили одинаковые сборки. Я попытался сделать среду как можно более похожей, но все же вижу некоторые различия в сгенерированных файлах .obj и .exe. Мне удалось исключить встроенные различия в путях и временные метки. Я также убедился, что минимальные примеры кода (например, программа hello world фактически создают идентичные двоичные файлы).
В настоящее время некоторые объектные файлы похожи, а другие нет. Если я посмотрю на те, которые отличаются, используя разницу dumpbin /all
, я вижу такие различия:
> COMDAT; sym= "public: static int const std::numeric_limits<long double>::max_exponent" (?max_exponent@?$numeric_limits@O@std@@2HB)
< COMDAT; sym= "public: static int const std::_Locbase<int>::collate" (?collate@?$_Locbase@H@std@@2HB)
во многих SECTION HEADER
. Не доказав это на 100%, мне кажется, что каждое различие - это строка, которая встречается в другом разделе в выгруженном выводе из другого объектного файла. Кажется, что все в другом порядке. (Но учтите, что это только мое текущее предположение - я могу ошибаться.)
Есть какие-нибудь намеки на то, как двигаться дальше и в чем может быть причина? Порядок сборки / связывания?
Я также видел, что Microsoft пишет это:
ПРИМЕЧАНИЕ. Нет никакой гарантии, что Visual C ++ сгенерирует один и тот же двоичный образ при построении одних и тех же исходных файлов при последующих сборках. Однако вам гарантируется, что EXE (или DLL) будет вести себя точно так же при выполнении, при прочих равных условиях.
но мне все еще интересно, что происходит в моем конкретном случае. В моем случае последовательные сборки на одной машине обеспечивают идентичные сборки.