Компиляция 32-битных приложений GTK + для 64-битных Linux - PullRequest
4 голосов
/ 24 ноября 2011

У меня возникли некоторые проблемы при компиляции 32-битных приложений GTK + в 64-битной Linux, особенно в Ubuntu 10.04. Компиляция 64-битных приложений GTK + работает нормально, и все настроено для компиляции 32-битных приложений, но не работает с GTK +

У меня есть очень простая тестовая программа, которую я использую для устранения неполадок, это просто gtk_init и gtk_main, которые прекрасно компилируются как -m64. Я компилирую с gcc 4.6.2, вызывая его с помощью:

gcc -m32 gtktest.c `pkg-config --cflags gtk+-2.0` `pkg-config --libs gtk+-2.0`

Это два разных типа сообщений об ошибках, которые я получаю:

/usr/local/lib/gcc/x86_64-unknown-linux-gnu/4.6.2/../../../../x86_64-unknown-linux-gnu/bin/ld: warning: libXext.so.6, needed by /usr/lib/../lib32/libgtk-x11-2.0.so, not found (try using -rpath or -rpath-link)

и

/usr/lib/../lib32/libgdk-x11-2.0.so: undefined reference to `XmbSetWMProperties'

Имейте в виду, что это не единственные ошибки, я просто включил два конкретных типа для справки и, если коротко, я получаю ошибки для всего стека библиотек GTK +.

У меня есть все надлежащие 32-битные версии библиотек в моих папках lib32.

Надеюсь, у кого-то уже была эта проблема, и она может мне помочь, это действительно вызывает у меня сильные головные боли, и я не могу сильно помочь кому-либо в сети.

Пожалуйста, спросите, нужна ли мне какая-либо другая информация, чтобы помочь с диагностикой этой проблемы.

Примечание: у меня есть пакеты ia32-libs и gcc-multilib. В Ubuntu 10.04 нет отдельных пакетов ia32-libs-gtk, но я думаю, что они включены в пакеты ia32-libs. Все они присутствуют в моей системе.

Я думаю, что это какая-то проблема с настройкой компоновщика. Недавно я создал новый компилятор Free Pascal и 32-битный кросс-компилятор, а также обновил GCC до 4.6.2, чтобы воспользоваться некоторыми новыми функциями C ++ и исправлениями поддержки C99. По умолчанию 4.4.3 GCC все еще существует в моей системе. Я думаю, что проблема была введена, когда я установил новый binutils, потому что я экспериментировал с Clang и LLVM в качестве цепочки инструментов, и я хотел использовать возможности плагинов, так что я решил, что может также обновить их все.

Все прекрасно работает при компиляции 64-битных программ, с новыми инструментами вообще не было ни одной проблемы, и я могу скомпилировать 32-битные программы, но когда приходит время явно связать что-то с, у меня возникают проблемы.

Я знаю, что мой текущий набор библиотек подходит, и у меня установлена ​​Free Basic, которая испускает только 32-битный код, и я смог без проблем собрать 32-битные программы GTK + перед этим обновлением.

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

Ответы [ 3 ]

0 голосов
/ 30 декабря 2013

Пакет GTK в 12.04, похоже, не работает правильно с multiarch.Вы можете обойти это в Ubuntu 12.04, создав следующие символические ссылки:

sudo ln -s /lib/i386-linux-gnu/libglib-2.0.so.0 /usr/lib32/libglib-2.0.so
sudo ln -s /usr/lib/i386-linux-gnu/libgtk-x11-2.0.so.0 /usr/lib32/libgtk-x11-2.0.so
sudo ln -s /usr/lib/i386-linux-gnu/libgdk-x11-2.0.so.0 /usr/lib32/libgdk-x11-2.0.so
sudo ln -s /usr/lib/i386-linux-gnu/libatk-1.0.so.0 /usr/lib32/libatk-1.0.so
sudo ln -s /usr/lib/i386-linux-gnu/libpangox-1.0.so.0 /usr/lib32/libpangox-1.0.so
sudo ln -s /usr/lib/i386-linux-gnu/libpango-1.0.so.0 /usr/lib32/libpango-1.0.so
sudo ln -s /usr/lib/i386-linux-gnu/libgmodule-2.0.so.0 /usr/lib32/libgmodule-2.0.so
sudo ln -s /usr/lib/i386-linux-gnu/libgobject-2.0.so.0 /usr/lib32/libgobject-2.0.so
sudo ln -s /usr/lib/i386-linux-gnu/libgdk_pixbuf-2.0.so.0 /usr/lib32/libgdk_pixbuf-2.0.so

Я нашел ответ в этой теме: http://www.blitzbasic.com/Community/posts.php?topic=101357

В качестве альтернативы (возможно, лучше), вы можете оставитьбазовая система не тронута и обновите вашу ссылку для поиска по имени файла вместо имени библиотеки.Что-то вроде:

gcc -m32 gtktest.c `pkg-config --cflags gtk+-2.0` -L/usr/lib/i386-linux-gnu -l:libgio-2.0.so.0 ...

Это не здорово.Вам нужно будет добавить -l: для каждой библиотеки, которую компоновщик не сможет найти, и ваша сборка прекратится, если имя файла библиотеки когда-либо изменится.

0 голосов
/ 29 ноября 2016

Вы можете указать pkg-config искать 32-битные библиотеки с помощью переменной среды PKG_CONFIG_PATH.Для Ubuntu

export PKG_CONFIG_PATH=/usr/lib32/pkgconfig:$PKG_CONFIG_PATH

Для Redhat

export PKG_CONFIG_PATH=/usr/lib/pkgconfig:$PKG_CONFIG_PATH
0 голосов
/ 24 ноября 2011

Я думаю, вам нужно установить пакеты ia32-libs-gtk & gcc-multilib, и вам нужно скомпилировать и связать с gcc -m32, как вы уже это сделали.

...