Компиляция 64-разрядного кода

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

После чтения тех глав пора скомпилировать код с 64-разрядной целевой архитектурой. Можно или скомпилировать код непосредственно (использующий GCC) или через XCode. Эта глава берет Вас посредством процесса установки Вашей среды сборки для 64-разрядной компиляции.

Компиляция 64-разрядного кода Используя GCC

По большей части компиляция 64-разрядного кода с помощью GCC работает тот же путь компиляцией 32-разрядного кода; существует несколько исключений, однако:

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

Новые флаги и функции 64-разрядной архитектуры

Несколько флагов, связанных с 64-разрядной архитектурой, были добавлены или изменены в GCC:

-arch x86_64

64-разрядная x86 опция архитектуры.

-Wconversion

Несмотря на то, что не технически новый для 64-разрядной архитектуры, эта опция главным образом полезна при переходе 32-разрядного кода к 64-разрядному. Когда определенные преобразования происходят между типами данных различных размеров, этот флаг заставляет дополнительные предупреждения быть распечатанными. Большинство этих предупреждений не будет полезно, таким образом, Вы не должны будете обязательно фиксировать все, что генерирует предупреждение с этим флагом. Однако можно иногда считать этот флаг полезным для того, чтобы разыскать дефицитные граничные случаи.

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

Конечно, этот флаг также производит многочисленные неожиданные предупреждения, которые безопасны. Например, в ANSI C, символьный литерал (например, 'c') имеет тип int, так передача его к функции, берущей тип char дает предупреждение усечения. Несмотря на то, что предупреждение педантично корректно, это в основном не важно. Необходимо будет отсортировать все эти предупреждения вручную и определить, которые законны и которые художественная литература.

-Wformat

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

-Wshorten-64-to-32

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

Кроме того, следующие флаги настоятельно рекомендованы:

-Wall

Включает много обычно полезных предупреждений.

-Wimplicit-function-declaration

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

Компиляция 64-разрядного кода Используя XCode

Этот раздел объясняет, как начать компилировать 64-разрядный код с помощью XCode. Эти инструкции предполагают, что Вы уже установили необходимые компоненты командной строки — т.е. осведомленная версия на 64 бита компилятора, компоновщика, ассемблера и других низкоуровневых инструментов.

С Xcode 1.0 и позже, можно создать двоичные файлы мультиархитектуры (MABs). Поскольку каждая цель может определить набор архитектуры для создаваемой цели, можно запретить архитектуру на основе на цель. Если цель содержит ассемблерный код для определенного процессора или не составляет чистые 64 бита, Вы могли бы, например, принять решение создать цель с сокращенным списком архитектуры.

Каждый раз Вы выполняете инструмент командной строки xcodebuild, можно указать который целевые архитектуры создать. Можно также сконфигурировать «стиль сборки» для создания определенного набора архитектуры из XCode.

XCode тогда создает цель для каждой указанной архитектуры, пропуская любую архитектуру, которую не поддерживает цель. Если цель не поддерживает ни одной указанной архитектуры, та цель пропускается полностью.

Установка сборки VALID_ARCHS определяет архитектуру, для которой может быть создана данная цель. Эта установка должна содержать список архитектуры, разделенной пробелами. Например, чтобы указать, что Ваша цель может быть создана для i386, и x86_64, набор VALID_ARCHS к "i386 x86_64" (без кавычек) в инспекторе XCode для Вашей цели.

Установка сборки ARCHS определяет архитектуру, для которой должен быть разработан весь проект. Эта установка должна также содержать разделенный пробелами список архитектуры. Эта установка сборки может быть определена любой на командной строке к xcodebuild, или в сборке разрабатывают в XCode.

Например, для разрабатывания проекта и для 32-разрядных и для 64-разрядных архитектур Intel введите:

        xcodebuild ARCHS="i386 x86_64"

Можно также установить ARCHS="i386 x86_64" в сборке разрабатывают в Вашем проекте. Точно так же, если Вы хотите создать только 64-разрядную версию Intel, указать ARCHS="x86_64".

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

При создании цели больше чем для одной архитектуры одновременно Вы будете видеть, что каждый исходный файл скомпилирован несколько раз. Это - нормальное поведение. XCode компилирует каждый исходный файл один раз для каждой архитектуры так, чтобы можно было передать различные флаги компилятора для каждой архитектуры. Файлы склеены в конце использования компиляции lipo. Для получения дополнительной информации посмотрите lipo.

Используя архитектурно-зависимые флаги

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

Если Вы хотите указать дополнительные флаги компилятора на архитектуру, можно использовать PER_ARCH_CFLAGS_семейство <arch> настроек сборки, где <дуга> имя архитектуры. Например, для указания флагов компилятора, применяющихся только к 64-разрядной компиляции Intel добавьте их к PER_ARCH_CFLAGS_x86_64 установка сборки.

Например, если Вы хотите сделать свою 64-разрядную часть выполненной только на OS X v10.6 вместо v10.5, Вы могли установить значение на архитектуру для “Развертывания OS X Target”: