Ориентация на разные процессоры при компиляции с Code :: Blocks - ошибка понимания - PullRequest
4 голосов
/ 04 октября 2011

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

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

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

  2. Я делаю это неправильно?Есть ли ПРАВИЛЬНЫЙ способ нацеливаться на разные архитектуры?

1 Ответ

3 голосов
/ 04 октября 2011

Здесь следует различать несколько вещей:

  • Существуют 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-битный код, и он будет работать.

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

...