Как собрать C++ программу для 64-битной архитектуры в IDE Visual Studio

Для смены архитектуры нужно явно указать IDE, что нужно собирать проект под 64-битную/разрядную систему. Для этого в каждом проекте решения надо изменить всего 2 опции, или просто проконтролировать их правильное изменение, т.к. они могут меняться автоматически как полностью, так и частично.

  1. Параметр Конечный компьютер. В обозревателе решений выбрать нужный проект → Главное меню → Проект → Свойства (этот пункт также можно было выбрать в контекстном меню проекта) → Свойства конфигурации → Библиотекарь (или Компоновщик) → Общие (также можно выбрать Все параметры) → Конечный компьютер → из выпадающего списка выбрать значение "MachineX64 (/MACHINE:X64)" вместо "MachineX86 (/MACHINE:X86)" или какой там был выбран до этого.
  2. Опция Дополнительные параметры может меняться двумя способами:
    1. В обозревателе решений выбрать нужный проект → Главное меню → Проект → Свойства (этот пункт также можно было выбрать в контекстном меню проекта) → Свойства конфигурации → Библиотекарь (или Компоновщик) → Все параметры → Дополнительные параметры → вписать короткое значение "x64" или полное/длинное "/machine:X64" или "MachineX64" вместо "/machine:X86", или выбрать (или вписать) любой из макросов, содержащих данное значение — $(Platform), $(Platform_Actual), $(PlatformName), $(PlatformShortName), $(PlatformTarget), $(PlatformTargetAsMSBuildArchitecture), $(TargetMachine) и пр.
    2. В обозревателе решений выбрать нужный проект → Главное меню → Проект → Свойства (этот пункт также можно было выбрать в контекстном меню проекта) → Свойства конфигурации → Библиотекарь (или Компоновщик) → Командная строка → поле Дополнительные параметры → вписать значение "/machine:X64" вместо "/machine:X86" или какой там был выбран. Вместе с переменной доп. опций всё значение будет следующим: "%(AdditionalOptions) /machine:X64".

Больше ничего трогать не надо. Напр., не надо удалять параметр "WIN32" в опции "Определения препроцессора".

Неточности

Часто путают значения "/machine:X64" и "/platform:x64". Это грубая ошибка! Вместо значения "/machine:X64" нельзя использовать значение "/platform:x64"! Это разные вещи! Иначе во время сборки появится предупреждение: «warning LNK4044: нераспознанный параметр "/platform:x64" игнорируется», т.е. неизвестное значение будет игнорировано, а нужное не учтено. Из-за этого сборка успешно не завершится т.к. целевые платформы проекта (x86 и x64) будут не совпадать.

Выходной каталог сборки

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

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

Для каждого проекта решения выходной каталог сборки настраивается тут: Проект → Свойства → Свойства конфигурации → Библиотекарь (или Компоновщик) → Общие → Выходной файл. Но там обычно всё значение состоит из макросов, и выглядит примерно так: «$(OutDir)$(TargetName)$(TargetExt)», что не очень понятно, т.к. нужно проверять значение каждого макроса. Поэтому куда легче посмотреть уже переведённое в реальный путь значение этого параметра в аргументе OUT, и выглядит оно примерно так: «/OUT:"D:\path\prog_name\x64\Debug\foo.lib" /MACHINE:X64».

Зависимости

Для компилируемых x64 исполняемых файлов надо обязательно указывать библиотеки также x64 разрядности.