Воспроизводимые сборки с помощью Visual Studio - разница в объектных файлах

Я стараюсь, чтобы две разные машины производили одинаковые сборки. Я пытался сделать среду максимально похожей, но все еще вижу некоторые различия в сгенерированных файлах.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) будут вести себя точно так же при исполнении, при прочих равных условиях.

но мне все еще интересно, что происходит в моем конкретном случае. В моем случае последовательные сборки на одной машине обеспечивают идентичные сборки.

1 ответ

Решение

Поэтому, хотя я не могу точно объяснить, почему бинарный файл выглядел так, как я это сделал, я обнаружил одно "неожиданное" различие в среде, которое было основной причиной.

В журнале сборки упоминались разные версии для rc.exe (компилятор ресурсов). Оказывается, это часть комплектов Windows, которые поставляются с VS. Однако, если вы установите две версии Visual Studio, они будут использовать rc, а компилятор и компоновщик разделены.

После того, как я установил другую VS, которую я не скомпилировал, бинарный файл изменился, чтобы соответствовать ожиданиям.

Другие вопросы по тегам