Заставить gcc скомпилировать 32-битные программы на 64-битной платформе - PullRequest
59 голосов
/ 17 августа 2010

У меня есть проприетарная программа, которую я пытаюсь использовать в 64-битной системе.

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

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

Есть ли способ (некоторые переменные окружения или что-то подобное) заставить gcc сделать все для 32-битной платформы. Будет ли работать 32-битный chroot?

Ответы [ 3 ]

70 голосов
/ 17 августа 2010

Вам нужно, чтобы GCC использовал флаг -m32.

Вы можете попробовать написать простой сценарий оболочки для $PATH и назвать его gcc (убедитесь, что вы не перезаписываете исходный gcc, и убедитесь, что новый сценарий появился раньше в $PATH, и что он использует полный путь к GCC.

Я думаю, что вам нужен код, похожий на /bin/gcc -m32 $* в зависимости от вашей оболочки ($* включает все аргументы, хотя это может быть что-то еще - очень важно!)

44 голосов
/ 06 августа 2012

Вы можете получить 32-разрядный двоичный файл, применив метод Алана Пирса, но вы также можете получить следующие ошибки:

fatal error: bits/predefs.h: No such file or directory

Если это так и если у вас есть apt-get, просто установитеgcc-multilib

sudo apt-get install gcc-multilib 
9 голосов
/ 20 мая 2014

Для любого кода, который вы компилируете напрямую, используя gcc / g++, вам нужно добавить опцию -m32 в командную строку компиляции, просто отредактируйте переменные CFLAGS, CXXFLAGS и LDFLAGS в ваш Makefile.

Для любого стороннего кода, который вы можете использовать, вы должны убедиться, что при его сборке он настроен для кросс-компиляции. Запустите ./configure --help и посмотрите, какие опции доступны. В большинстве случаев вы можете предоставить переменные CFLAGS, CXXFLAGS и LDFLAGS сценарию конфигурации. Вам также может понадобиться добавить --build и --host в скрипт конфигурации, чтобы вы получили что-то вроде

./configure CFLAGS=-m32 CXXFLAGS=-m32 LDFLAGS=-m32 --build=x86_64-pc-linux-gnu --host=i686-pc-linux-gnu

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

...