Як скласти 32-розрядний двійковий файл на 64-бітній машині Linux з gcc / cmake


129

Чи можна скомпілювати проект в 32-бітному з cmakeі gccна 64-бітної системі? Мабуть, так і є, але як це зробити?

Коли я спробував це "невідомим" способом, не встановлюючи жодних параметрів / прапорів / тощо, просто налаштувавши LD_LIBRARY_PATHпошук пов'язаних бібліотек, ~/tools/libвін, здається, ігнорує його і загляне лише у підкаталоги з іменем lib64 .


1
Чи достатньо було б передати прапор -m32 до gcc? Як я б тоді це зробив у cmake?
— дала

Відповіді:


124
export CFLAGS=-m32

2
Це має робити. Ви також можете змінити сценарій cmake, щоб створити 32-бітну ціль - вона просто додатиметься -m32до CFLAGS, можливо, встановивши CMAKE_REQUIRED_FLAGS.
— caf

5
Ну, проблема полягає в тому, що цього, звичайно, недостатньо. Можливо, вам також знадобиться налаштувати лінкер!
— lpapp

6
Що exportозначає? Де вона належить? Файли заголовків? makefile? Ні, абсолютно не відповідь для мене як для початківця.
— Томаш Зато - Відновіть Моніку

1
@ TomášZato: перед запитом оболонки перед тим, як викликати cmake(однак у вашому випадку, якщо у вас є Makefile, ви б makeзамість цього використовували ).
— caf

4
@caf, чи можете ви детальніше розглянути свою відповідь? Ваша відповідь дуже лаконічна і нічого не пояснює.
— Булат М.

76
$ gcc test.c -o testc
$ файл testc
testc: 64-розрядний виконуваний файл LSB ELF, x86-64, версія 1 (SYSV), динамічно пов'язаний (використовує спільні лібри), для GNU / Linux 2.6.9, не позбавлений
$ ldd testc 
    linux-vdso.so.1 => (0x00007fff227ff000)
    libc.so.6 => /lib64/libc.so.6 (0x000000391f000000)
    /lib64/ld-linux-x86-64.so.2 (0x000000391ec00000)
$ gcc -m32 test.c -o testc
$ файл testc
testc: ELF 32-бітний виконуваний LSB, Intel 80386, версія 1 (SYSV), динамічно пов'язаний (використовує спільні лібри), для GNU / Linux 2.6.9, не позбавлений
$ ldd testc
    linux-gate.so.1 => (0x009aa000)
    libc.so.6 => /lib/libc.so.6 (0x00780000)
    /lib/ld-linux.so.2 (0x0075b000)

Якщо коротко: використовуйте -m32прапор для складання 32-розрядного двійкового файлу.

Також переконайтеся, що у вас встановлені 32-бітні версії усіх необхідних бібліотек (у моєму випадку все, що мені потрібно для Fedora, було glibc-devel.i386)


1
Щиро дякую! Так, у мене є 32-бітні версії залежностей.
— дала

6
Як я можу встановити 32-бітні версії бібліотек?
— Томаш Зато - Відновити Моніку

2
@ TomášZatosudo apt-get install gcc-multilib
— Меттью Мердок

16

У пізніших версіях CMake одним із способів зробити це для кожної цілі є:

set_target_properties(MyTarget PROPERTIES COMPILE_FLAGS "-m32" LINK_FLAGS "-m32")

Я не знаю способу зробити це в усьому світі.


+1. Я намагаюся створити 32-бітний таліг ( developer.kde.org/~wheeler/taglib.html ) на 64-бітному сніговому леопарді. Це працює для мене.
— edwardw

3
… Зробити це в усьому світі:cmake -D CMAKE_CXX_FLAGS=-m32 . && make
— диома


6

Один із способів - це налаштування середовища chroot. Для Debian є ряд інструментів для цього, наприклад, debootstrap


2
Здається трохи екстремальним, щоб налаштувати середовище chroot просто для створення 32-бітних додатків, чи не так? Якась конкретна причина, чому ви рекомендуєте це?
— Фредрік

3
Це дає вам повне середовище, в якому також можна запустити код. Ми використовуємо це для створення (та запуску) повних 32-бітових бінарних файлів на 64-бітних хостах - іноді ви отримуєте лише 32-бітні збірки сторонніх бібліотек. Для роботи Debian ми використовуємо його для створення 32-бітових пакетів на 64-бітних хостах.
— Дірк Еддельбюттель

Я ніколи не відчував жодних проблем з тим, що коли-небудь створював і запускав 32-бітні бінарні файли ні на Linux, ні на Solaris, ні на будь-якій іншій 64-бітній платформі. Але я не дуже використовую Debian.
— Фредрік

Фредерік, ви також розгортаєте їх у 32 бітах на 64-бітному хості збірки?
— Дірк Еддельбуеттель

@Dirk: 32-бітні двійкові файли працюють як на 32, так і на 64-бітних машинах (звичайно), 64-бітні двійкові файли працюють лише на 64-бітних машинах. Не має значення, чи це машина замовника або хост складання. Я, чесно кажучи, не бачу, де ця проблема була б, якщо це не модулі ядра, які ви будуєте.
— Фредрік

6

Для будь-якого складного застосування пропоную використовувати контейнер lxc . Контейнери lxc - це щось середнє між хроот на стероїдах та повноцінною віртуальною машиною.

Наприклад, ось спосіб побудови 32-бітного вина за допомогою lxc в системі Ubuntu Trusty:

sudo apt-get install lxc lxc-templates
sudo lxc-create -t ubuntu -n my32bitbox -- --bindhome $LOGNAME -a i386 --release trusty
sudo lxc-start -n my32bitbox
# login as yourself
sudo sh -c "sed s/deb/deb-src/ /etc/apt/sources.list >> /etc/apt/sources.list"
sudo apt-get install devscripts
sudo apt-get build-dep wine1.7
apt-get source wine1.7
cd wine1.7-*
debuild -eDEB_BUILD_OPTIONS="parallel=8" -i -us -uc -b
shutdown -h now   # to exit the container

Ось сторінка вікі про те, як створити 32-бітове вино на 64-бітному хості за допомогою lxc .


цікаво. Чи можу я використовувати його для компіляції atomтекстового редактора на 32-бітну 64-бітну машину?
— Anwar

1
@Anwar, я думаю, що так. Це повинно працювати, щоб побудувати що завгодно.
— Сем Уоткінс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.