Одинаковая сборка на разных системах - PullRequest
6 голосов
/ 03 августа 2009

У меня 3 машины сборки. Один работает на Windows 2000, один с XP SP3 и один с 64-битной Windows Server 2008. И у меня есть собственный проект C ++ для сборки (я работаю с Visual Studio 2005 SP1). Моя цель - собрать "точно" те же библиотеки DLL, используя эти машины сборки.

Точно я имею в виду по крупицам (кроме разметки времени сборки, конечно).

С win2k и winxp я получаю идентичные DLL. Но они отличаются от dll, построенных на сервере win2008. Мне удалось получить почти идентичные DLL, но есть некоторые различия. После разборки файлов я обнаружил, что порядок функций не одинаков (3 функции в разном порядке).

Кто-нибудь знает, в чем причина?

И дополнительный вопрос: В vcbuild.exe я нашел переключатель / ЗАКАЗАТЬ. Который принимает файл заказа функции в качестве входных данных. Кто-нибудь знает, как должен выглядеть этот файл?

Ответы [ 3 ]

7 голосов
/ 03 августа 2009

Вы можете подумать, что компиляция является чисто детерминированной (идентичные входные данные дают идентичный выходной файл каждый раз), но это не обязательно так. Например, рассмотрим оптимизатор - для работы потребуется определенная память, вероятно, больше для более высоких методов оптимизации. Если на одной машине не удается выделить память (потому что у машины меньше памяти), компилятор может пропустить эту конкретную оптимизацию, что приведет к выдаче другого кода.

Есть много подобных ситуаций, поэтому вы можете приложить много усилий к чему-то, что не выполнимо. В любом случае, зачем вам библиотеки DLL должны быть одинаково по битам?

0 голосов
/ 03 августа 2009

Является ли Windows Server 2008 единственной машиной с 64-разрядной версией? Если это так, то это может быть вашей проблемой.

0 голосов
/ 03 августа 2009

Используете ли вы ту же версию инструмента цепочки (компилятор, компоновщик, ...), включая разницу 32/64 бит?

...