Попытка понять взаимодействие между компилятором и компоновщиком для мультиплатформенной компиляции - PullRequest
1 голос
/ 20 сентября 2011

У меня есть проект C ++ Visual Studio, который я пытаюсь скомпилировать для архитектуры x86 и x64.Я гуглил и нашел много информации о том, как это сделать, и, похоже, это работает, но это сильно смущает меня по поводу того, что происходит за кулисами.

По-видимому, единственная разница в настройках - этовключите флаги командной строки linker (точнее, это флаг / MACHINE).

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

Итак, мой вопрос: какие части процесса сборки ведут себя не так, как я думал?

Спасибо за ваше время и мудрость!

Michael

1 Ответ

0 голосов
/ 20 сентября 2011

При компиляции для 32-разрядной версии x86 Visual Studio использует компилятор \ Program Files \ Microsoft Visual Studio 10.0 \ VC \ bin \ cl.exe. При компиляции для 64-битной x86 Visual Studio использует компилятор \ Program Files \ Microsoft Visual Studio 10.0 \ VC \ bin \ amd64 \ cl.exe. Первый компилятор создает 32-разрядные объектные файлы, второй создает 64-разрядные объектные файлы. Это можно увидеть, запустив dumpbin.exe для объектных файлов, чтобы увидеть их указанную архитектуру.

Вызов компилятора остается тем же (более или менее) - что изменяет исполняемый файл $ PATH, который устанавливается перед сборкой. Указывая PATH на 32-битный или 64-битный каталог, он незаметно меняет весь набор программ, запускаемых для построения вашего проекта. Вы можете увидеть это, посмотрев Свойства проекта> Свойства конфигурации> Каталоги VC ++> Исполняемые каталоги и нажав «Изменить». В поле «Унаследованные значения» вы увидите путь к текущей конфигурации и платформе.

...