Таргетинг различных процессоров при компиляции с кодом:: Blocks-ошибка понимания


Я разрабатываю приложение C, используя Code:: Blocks, и должен ориентироваться на несколько платформ (32 бит, 64 бит). Мое поле разработки 64-битное, поэтому я попытался проверить опцию i386 (-march=i386) для компилятора в настройках проекта. Теперь, когда я компилирую, я получаю:

Mainc: 1: ошибка: выбранный процессор не поддерживает набор инструкций x86-64

  1. Я не понимаю этого сообщения! Указав i386, не следует ли просто генерировать инструкции x86 (а не -64)? Кроме того, мой процессор X86-64 так почему же мой процессор не поддерживает это?

  2. Я делаю это неправильно? Есть ли правильный способ ориентироваться на разные архитектуры?

1 4

1 ответ:

Вы должны различать здесь несколько вещей:

    Существуют 32-и 64-разрядные "платформы", работающие на одном и том же процессоре . Один и тот же процессор X86-64 может работать в режиме или x86 или AMD64. Это определяет, среди прочего, количество доступных регистров, их размеры, расположение стека, различное соглашение о вызовах и некоторые другие опкоды (также обратите внимание, что во многих операционных системах 32-битный код будет выполняться на некотором уровне совместимости в 64-битной ОС без проблемы)
  • существуют компиляторы для любой из этих платформ, и существуют компиляторы, которые могут производить любую из обеих (но не обе одновременно).
  • Компилятор может быть другой платформой, чем та, для которой построена программа (так называемый кросс-компилятор, очень распространенная вещь, например, при разработке для встраиваемых систем, но вы также можете скомпилировать, например, для Windows-32 из Linux-64 или наоборот, или скомпилировать для Win64 на Win32 компьютер).
  • в дополнение к платформе, существует специфическое для модели различие в генерируемом коде (-march переключатель). Это решает, какая генерация процессора предполагается, что определяет, какие инструкции могут быть использованы при создании кода. Не каждая комбинация платформы и архитектуры допустима (это ваша проблема: предположение, что 25-летний процессор 386 означает, что он не может работать в режиме AMD64).
  • необязательно, вы даже можете запланировать что-то другое, чем вы генерировать код для. Например, вы можете создать код, который использует инструкции для Pentium III, но расписание для Core i7. Он будет работать (неоптимально, но он будет работать) практически на каждом процессоре и оптимально работать на самой новой линии.
  • Наконец, существует множество переключателей, таких как семейство -msse, которые дополнительно включают/отключают инструкции.

Вы не указали "Windows" или "Linux" или что-либо еще, поэтому трудно дать точный ответ на то, что ваш проблема в том, но давайте предположим, что вы можете использовать, например, MingW-w64. Этот компилятор позволяет создавать как 32 -, так и 64-разрядный код в зависимости от того, что вы ему скажете. Очевидно, если вы скажете ему генерировать код в режиме 64 (по умолчанию!), то i386 не является хорошим выбором. Если вы дадите ему -m32 в качестве опции командной строки, он будет генерировать 32-битный код, и он будет работать.

Это может помочь найти более конкретный ответ, если вы скажете точно, какой компилятор вы используете. Код:: блоки приходит (опционально) С TDM 4.5.1 сборка на Windows, например, но использует все, что есть под другими операционными системами.