Построение 32-битного приложения в 64-битном Ubuntu

19

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

/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 из Ссылка , чтобы загрузить все архивы .a, необходимые для связывания , Затем работал gcc . Я думаю, что gcc выполнял поиск в каталоге / usr / lib32 , но не нашел архивы .a , поэтому продолжил поиск в стандартном каталоге который является / usr / lib , где он находит несовместимые файлы *. so .

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

    
задан Rich 07.12.2011 в 20:53
источник

2 ответа

13

LDFLAGS также должно содержать -m32 . Следующее должно работать:

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

Фактически вы можете удалить -L/usr/lib32 part, так как это каталог по умолчанию для 32-битных библиотек, и ваша система знает об этом.

В принципе, самый простой способ построить 32-битное приложение на 64-битной машине:

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

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

UPDATE:

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

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

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

    
ответ дан Andrejs Cainikovs 07.12.2011 в 20:59
источник
5

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

/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
    
ответ дан Vladimir Panteleev 28.06.2014 в 14:33