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