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

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

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

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

Ответы

Ответ 1

Обновление

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

make MXE_TARGETS=i686-w64-mingw32.shared qt5

оригинальный

EDIT: я создал репозиторий 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 так, чтобы он соответствовал динамическим направлениям.

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

Ответ 2

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

sudo apt-get install wine

Затем загрузите Qt5 Windows MinGW SDK Запустите с вином

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 и компилятор, используя вино. Я не знаю, насколько медленнее он сравнивается с родным бинарным Linux. Но jom доступен, и вы можете использовать несколько ядер для компиляции, если ваш проект такой большой.

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

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

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

Ответ 3

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

Ответ 4

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

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