Компиляция 32-битных приложений XForms на 64-битном Linux Mint

Что мне не нравится в GTK, так это сложность разработки 32-битных приложений на 64-битной Linux машине. В обсуждении на StackOverflow решили использовать отдельную виртуальную машину с 32-битным Linux на борту. Это не очень удобно.

Библиотека xlib лишена этого недостатка. Но она слишком низкоуровневая. И тут я наткнулся на XForms. Это графическая библиотека, основанная на xlib и распространяемая под лицензией LGPL. О том, как я настраивал ее на своем домашнем компьютере я и хотел бы сегодня рассказать.

Первым делом я обратился к руководству по установке на сайте разработчика (доступно по ссылке). Как и следовало ожидать у меня ничего не получилось. Прошел все этапы, но тестовый пример не скомпилировался. Тогда я обратился к Менеджеру программ. С его помощью я установил пакет libforms-dev.

После этого приложение нормально скомпилировалось и даже запустилось. Компиляция осуществлялась следующей командой:

g++ main.cpp -o main -Wall -Wextra -pedantic -lX11 -lforms

Попробуем теперь собрать 32-битное приложение:

g++ main.cpp -o main -m32 -Wall -Wextra -pedantic -lX11 -lforms

Разумеется ничего не вышло:

Компоновщик пытается объединить скомпилированный 32-битный модуль с 64-битными библиотеками и, разумеется, у него ничего не получается. Хорошо, устанавливаем 32-битную версию XForms:

sudo apt-get install libforms-dev:i386

Проверяем (с xlib этого было достаточно). Теперь перестала компилироваться 64-битная версия приложения. И опять ошибка та же: «skipping incompatible». Для восстановления работоспособности пришлось переустановить пакет libforms-dev. Я не сразу понял в чем дело.

А дело оказалось в библиотеках libforms.a и libforms.so. При установке пакета libforms-dev они записываются в каталог /usr/lib. Когда мы устанавливаем 64-битную версию XForms, в /usr/lib записываются 64-битные версии этих библиотек. При установке 32-битной версии XForms 64-битные версии библиотек удаляются, а на их место записываются их 32-битные аналоги. Как заставить их сосуществовать друг с другом? Очень просто.

1. Устанавливаем 32 битную версию XForms (libforms-dev:i386).
2. Переносим библиотеки libforms.a и libforms.so (вместе с ссылками) из каталога /usr/lib в каталог /usr/lib32.
3. Устанавливаем 64-битную версию XForms (libforms-dev).

Теперь всё должно работать. Если вдруг компоновщик откажется находить 32-битную версию запишите команду компиляции так:

g++ main.cpp -o main_32 -m32 -Wall -Wextra -pedantic -lX11 -L"/usr/lib32/" -lforms

Здесь мы явно указываем ему где искать библиотеки.

Что меня еще порадовало в XForms так это отсутствие предупреждений при компиляции под стандарт С++98. GTK в этом случае выдает кучу предупреждений об использовании еще не разрешенных вариативных макросов (variadic macroses).

Приложение на базе XForms выглядит значительно лучше, чем такое же приложение на базе xlib, но не так нативно, как приложение на базе GTK.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *