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

После нескольких часов поисков, я решил сдаться и спросить у вас экспертов. Я пытаюсь создать 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 , поэтому продолжил поиск в стандартном каталоге, который является [ 1125] / usr / lib , где он находит несовместимые файлы *. So .

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

23
задан 8 December 2011 в 07:38

2 ответа

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 dlopen ()/dlsym () API.

15
ответ дан 8 December 2011 в 07:38

Я получал ошибки, такие как:

/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
9
ответ дан 8 December 2011 в 07:38

Другие вопросы по тегам:

Похожие вопросы: