Кросс-компиляция приложения 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 включает в себя динамически связанные файлы.