Створення 32-розрядного додатка в 64-розрядному Ubuntu


23

Після годин гугла, я вирішу відмовитись і запитати вас у експертів. Я намагаюся створити 32-розрядний додаток (xgap, якщо хтось зацікавлений) в моєму 64 Ubuntu 11.10. Я додав CFLAGS = -m32 та LDFLAGS = -L / usr / lib32 у makefile. Об'єкти вбудовані в 32-ти бітовий тон. Останній крок - з'єднати всі об’єкти та бібліотеки для X windows у цей виконуваний --- xgap. Якось він і надає мені цю помилку:

gcc -o xgap xcmds.o utils.o gapgraph.o gaptext.o pty.o popdial.o xgap.o selfile.o   -L/usr/lib32 -lXaw -lXmu -lXt -lXext -lX11  -lSM -lICE

/usr/bin/ld: skipping incompatible /usr/lib32/libXmu.so when searching for -lXmu
...

/usr/bin/ld: i386 architecture of input file `xcmds.o' is incompatible with i386:x86-64 output
...

Я встановив ia32-libs та mutilib підтримку . Я думаю, що мені просто потрібно змусити лінкер генерувати вихід i386. Я намагався поставити два прапори ld у своїй команді gcc, як показано вище: -melf_i386 та -oformat elf32-i386 . Але що трапляється, що gcc більше не шукає 32-бітну бібліотеку в / usr / lib32 . Цікаво, чи потрібно мені поставити ці прапори в певному порядку?

Дякуємо за будь-яку ідею та допомогу!

EDIT: коли я додаю прапор -m32 в останню команду gcc (я вважаю, що етап зв’язку), навіть якщо у мене є прапор -L / usr / lib32, gcc більше не шукає в / usr / lib32 (дійсно weird ...) та створює таку помилку:

/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.6.1/../../../libXaw.so when searching for -lXaw
/usr/bin/ld: skipping incompatible /usr/lib/libXaw.so when searching for -lXaw
/usr/bin/ld: cannot find -lXaw
collect2: ld returned 1 exit status

Хтось має ідею, чому це відбувається? Я використовую автоматичний інструмент для налаштування та створення. Я дуже добре модифікую ці файли сценаріїв.

EIDT : Я вирішив проблему. Я думаю, що gcc очікував статичного архіву бібліотеки. Я використовував сценарій getlibs з http://ubuntuforums.org/showthread.php?t=474790, щоб завантажити всі архіви .a, необхідні для посилання. Потім працював gcc . Я думаю, що gcc здійснив пошук у каталозі / usr / lib32, але не знайшов архівів .a, тому продовжив пошук у стандартному каталозі, який є / usr / lib , де він знаходить несумісні * * .so файли.

Але тоді питання: у файлах * .so в / usr / lib32 / з пакету ia32-libs насправді немає бібліотек, необхідних для посилання? Для чого використовуються ті файли в / usr / lib32 / ?



Відповіді:


15

LDFLAGSповинні включати -m32також. Слід працювати:

export LDFLAGS='-m32 -L/usr/lib32'

Насправді ви можете скинути -L/usr/lib32частину, оскільки це каталог за замовчуванням для 32-бітових ліб, і ваша система знає про це.

В основному, найпростіший спосіб скласти 32-бітний додаток на 64-бітній машині:

export CFLAGS='-m32'
export CXXFLAGS='-m32'
export LDFLAGS='-m32'
make

.. або подайте ці змінні для налаштування сценарію, якщо ви використовуєте autotools.

ОНОВЛЕННЯ:

Здається, ви насправді не знайомі щодо відмінностей у зв’язку зі статичними та динамічними бібліотеками. Я постараюся бути якомога меншим:

  • І бібліотеки статичної, і динамічної розробки мають однакове розширення файлів .a
  • Якщо ви встановили як статичну, так і динамічну версії однієї бібліотеки, одна з них може мати додатковий постфікс, як libname.aдля динамічної, так і libname_s.aдля статичної версії.
  • Звичайно, статичні та динамічні версії бібліотеки відрізняються за розміром. Статична версія важча.
  • Якщо ви зв’язуєтесь зі статичною бібліотекою - ваша програма не має залежностей. Якщо ви пов'язуєтесь з динамічною бібліотекою, вона покладається на .soбібліотеку часу виконання, яка повинна бути присутнім у вашій системі.

Зауважте, ми не говоримо про прогресивні трюки, як, наприклад, явне завантаження DSO за допомогою API dlopen () / dlsym ().


Тепер я думаю, що з моїм налаштуванням щось не так. Щоразу, коли я додаю -m32 в останню команду gcc, вона шукає натомість папку / usr / lib. Якщо я не додаю -m32 і не використовую прапор -L / usr / lib32, він шукає правильний каталог, але генерував помилки вище. Чи знаєте ви, що могло це спричинити?
Багатий

А що буде, якщо ви поєднаєте обидва (як у моєму прикладі вище)?
Андрейс Кайніков

якщо я комбіную обидва, він все ще не шукає в / usr / lib32. він просто шукає в / usr / lib. І btw, я використовую автоматичні інструменти.
Багатий

Дивно .. Ви -l/usr/lib32/libXaw.soнатомість намагалися годувати ?
Андрейс Кайніков

Він не може їх знайти ....: gcc -o xgap xcmds.o utils.o gapgraph.o gaptext.o pty.o popdial.o xgap.o selfile.o -O2 -L / usr / lib32 -l / usr / lib32 / libXaw.so -l / usr / lib32 / libXmu.so -l / usr / lib32 / libXt.so -l / usr / lib32 / libXext.so -l / usr / lib32 / libX11.so -l / usr / lib32 / libSM.so -l / usr / lib32 / libICE.so -m32 / usr / bin / ld: не вдається знайти -l / usr / lib32 / libXaw.so
Rich

9

Я отримував помилки, такі як:

/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.8/libstdc++.so when searching for -lstdc++

Це зафіксувало це для мене:

sudo apt-get install g++-multilib

якщо ви використовуєте пакет gcc, відмінний від типового (наприклад gcc-7), тоді вам потрібно встановити пакет для цієї конкретної версії:

sudo apt-get install g++-7-multilib

1
g++-multilibпризначено для g ++ (C ++), для gcc (C) також потрібно gcc-multilib.
pevik
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.