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

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]