Кросс-компиляция приложения Qt для Windows в Linux с динамическим связыванием

Чтобы соответствовать лицензии Qt LGPL, приложение, использующее библиотеку Qt, должно либо сделать исходный код доступным, либо динамически связываться с Qt (если я понял это правильно в этих нескольких словах).

Поэтому я хотел бы создать приложение с закрытым исходным кодом, делающее именно это. Кроме того, я хотел бы разработать для Linux (в настоящее время Xubuntu 12.04) использование g++/MinGW с поддержкой C++11 для создания бинарных файлов Windows. Я следовал этому полезному руководству, чтобы выполнить последнее. Но, как говорится в руководстве, создаются статически связанные исполняемые файлы.

Поскольку я использовал MXE для автоматической загрузки и сборки библиотеки Qt (версия 5.0), у меня не было особого шанса повлиять на процесс. Поэтому мой вопрос: как мне создать динамически связанные версии библиотеки Qt и соответствующих приложений?

4 ответа

Обновить

Теперь предпочтительным способом построения динамических версий библиотек с MXE является указание опции "shared" для цепочки инструментов:

make MXE_TARGETS=i686-w64-mingw32.shared qt5

оригинал

РЕДАКТИРОВАТЬ: я создал репозиторий git, где я прошел и внес все необходимые изменения в MXE для создания общей версии qtbase. Он доступен по адресу https://github.com/jeremysalwen/mxe. Чтобы собрать, клонируйте репозиторий и затем запустите 'make qtbase'. Я оставил свой оригинальный пост ниже.

Итак, я скачал среду mxe, и похоже, что используемый код компиляции qt является справкой в ​​src / qt.mk

Основная процедура состоит в том, чтобы сопоставить этот код со стандартными указаниями для построения qt. Если вы загляните внутрь qt.mk и qtbase.mk, вы увидите, что на самом деле все довольно просто и, по сути, просто запускает./configure, make и затем устанавливает сгенерированные файлы. Если вы можете посмотреть на это, вы сможете сопоставить направления для статического / динамического построения qt и изменить qt.mk так, чтобы он соответствовал динамическим направлениям.

В любом случае, я думаю, что нашел проблему. Похоже, различие заключается в флаге "-static" при компиляции qt. Так что, если мы просто удалим флаг "-static", который передается в./configure в qt.mk и qtbase.mk, я ожидаю, что mxe затем создаст динамическую версию qt. Конечно, вам может потребоваться изменить другие вещи, но, надеюсь, это все, что вам нужно сделать.

Сначала вам нужно настроить вино.

sudo apt-get install wine

Тогда скачайте Qt5 Windows MinGW SDK Run with wine

wget http://releases.qt-project.org/qt5/5.0.1/qt-windows-opensource-5.0.1-mingw47_32-x86-offline.exe
wine qt-windows-opensource-5.0.1-mingw47_32-x86-offline.exe

Следуйте указаниям мастера установки Qt. затем

cd ~/.wine/drive_c/Qt/Qt5.0.1/Tools/QtCreator/bin
wine qtcreator.exe

Я попробовал примеры в qtcreator, он компилируется и хорошо работает под Linux, и когда я копирую exe-файл на компьютер с Windows с настроенной Qt, он также работает хорошо.

Конечно, один недостаток заключается в том, что вы не чувствуете себя нативным при использовании qtcreator, а компилятор при помощи wine. Я не знаю, насколько медленнее это по сравнению с родным бинарным Linux. Но jom доступен, и вы можете использовать несколько ядер для компиляции, если ваш проект такой большой.

Чтобы использовать jom вместо make в qtcreator, измените здесь в qtcreator.

projects > Build & Run > Build > Build Steps > Make

замените на jom и добавьте аргументы make -j N, где N - это номера ядра, которые вы хотите использовать.

Я недавно наткнулся на это и нашел некоторый успех с октавской вилкой mxe. Он прошел через труд, чтобы собрать qt с поддержкой разделяемой (.dll) библиотеки, которая удовлетворяла мои потребности. Вот ссылка на его пост.

Вам нужно собрать QT для динамической компоновки. Если у вас есть QT, созданный для статической компоновки (обычно это файлы.a в linux), ваш двоичный файл будет статическим. Если вы строите с использованием общих объектных файлов (.so) в Linux, ваш двоичный файл будет динамически связан. Вам также нужно будет включить соответствующие DLL-файлы в ваше приложение, чтобы, когда кто-то еще запускал исполняемый файл, он имел доступ к этим библиотекам.

QT SDK от qt-project.org включает в себя динамически связанные файлы.

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