Я стараюсь, чтобы две разные машины производили одинаковые сборки. Я пытался сделать среду максимально похожей, но все еще вижу некоторые различия в сгенерированных файлах .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) будут вести себя точно так же при исполнении, при прочих равных условиях.
но мне все еще интересно, что происходит в моем конкретном случае. В моем случае последовательные сборки на одной машине обеспечивают идентичные сборки.
Поэтому, хотя я не могу точно объяснить, почему бинарный файл выглядел так, как я это сделал, я обнаружил одно «неожиданное» различие в среде, которое было основной причиной.
В журнале сборки упоминались разные версии для rc.exe (компилятор ресурсов). Оказывается, это часть комплектов Windows, которые поставляются с VS. Однако, если вы установите две версии Visual Studio, они будут использовать rc, а компилятор и компоновщик разделены.
После того, как я установил другую VS, которую я не скомпилировал, бинарный файл изменился, чтобы соответствовать тому, что я ожидал.
Других решений пока нет …