Як скласти 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.