Сборка 32-битного приложения в 64-битной Ubuntu

23

После нескольких часов поисков я решил сдаться и спросить у вас экспертов. Я пытаюсь создать 32-разрядное приложение (xgap, если кто-то заинтересован) в моей 64-й версии Ubuntu 11.10. Я добавил CFLAGS = -m32 и LDFLAGS = -L / usr / lib32 в make-файл. Объекты встроены в 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 . Интересно, нужно ли мне поставить эти флаги в каком-то фиксированном порядке?

Спасибо за любую идею и помощь!

РЕДАКТИРОВАТЬ: когда я добавляю флаг -m32 в моей последней команде gcc (я считаю, что это этап связывания), даже если у меня установлен флаг -L / usr / lib32, gcc больше не выполняет поиск в / usr / lib32 (на самом деле странно ...) и генерирует следующую ошибку:

/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

Кто-нибудь знает, почему это происходит? Я использую автоматический инструмент для настройки и создания. Я действительно хорош в модификации этих файлов скриптов.

ЭЙДТ : Я решил проблему. Я думаю, что 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 / ?

Богатый
источник
Связанные stackoverflow.com/questions/22355436/…
Сиро Сантилли 新疆 改造 中 at 法轮功 六四 事件
связанные: stackoverflow.com/questions/58654288/…
smwikipedia

Ответы:

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

..или эти переменные для настройки скрипта, если вы используете автоинструменты.

ОБНОВИТЬ:

Похоже, вы не очень знакомы с различиями в связывании со статическими и динамическими библиотеками. Я постараюсь быть как можно меньше:

  • И статические, и динамические библиотеки разработки имеют одинаковое расширение файла. .a
  • Если вы установили как статические, так и динамические версии одной и той же библиотеки, одна из них может иметь дополнительный постфикс, как libname.aдля динамической, так и libname_s.aдля статической версии.
  • Конечно, статические и динамические версии библиотеки отличаются по размеру. Статическая версия тяжелее.
  • Если вы связываете со статической библиотекой - ваше приложение не имеет зависимостей. Если вы свяжетесь с динамической библиотекой, она будет полагаться на .soбиблиотеку времени выполнения, которая должна присутствовать в вашей системе.

Обратите внимание, что здесь мы не говорим о дополнительных хитростях, таких как явная загрузка DSO с использованием API dlopen () / dlsym ().

Андрейс Кайников
источник
Теперь я думаю, что что-то не так с моей настройкой. Всякий раз, когда я добавляю -m32 в моей последней команде gcc, он ищет папку / usr / lib. Если я не добавляю -m32 и не использую флаг -L / usr / lib32, он ищет правильный каталог, но генерирует ошибки, описанные выше. Вы знаете, что может вызвать это?
Богатое
И что произойдет, если вы объедините оба (как в моем примере выше)?
Андрейс Каиников
если я объединю оба, он все равно не будет искать в / usr / lib32. он просто ищет в / usr / lib. И, кстати, я использую авто инструменты.
Богатое
Странно .. Вы пытались -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