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

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

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

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


person Ratatwisker    schedule 28.01.2013    source источник
comment
Один вопрос по этому поводу: почему бы не использовать mingw в Windows? Я думаю, что кросс-компилятор mingw в Linux будет поддерживать С++ 11 на том же уровне, что и в Windows.   -  person Min Lin    schedule 29.03.2013
comment
@MinLin для меня причина в более удобной среде Linux.   -  person tshepang    schedule 31.03.2013


Ответы (4)


обновить

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

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. Конечно, вам может понадобиться изменить другие вещи, но, надеюсь, это все, что вам нужно сделать.

person Jeremy Salwen    schedule 20.02.2013
comment
@Tshepang: я создал репозиторий на github, где внес необходимые изменения в сценарии сборки для qtbase и всех его зависимостей. Я добавил ссылку в свой пост. - person Jeremy Salwen; 24.02.2013
comment
хорошо строится, как и мое приложение; теперь я должен просто выяснить, как это упаковать и запустить в Windows - person tshepang; 25.02.2013
comment
То же самое здесь, так что большое вам спасибо. При запуске скомпилированного приложения в Windows сначала отсутствуют dll (конечно), но при копировании нужных я получаю только ошибку времени выполнения. Я буду исследовать это дальше. - person Ratatwisker; 26.02.2013
comment
Я не уверен, каким будет следующий шаг. Я вижу, что есть куча предлагаемых загрузок, и тот, что помечен как MinGW 4.7, скорее всего, правильный. Просто поставить и все будет хорошо? Это то, что вы пробовали @Ratatwisker? Я боюсь его скачивать, только чтобы обнаружить, что он не работает (слишком большой, 800 МБ+). - person tshepang; 02.03.2013
comment
Я пробовал как из пакета MinGW, так и из сборки mxe (находится в ‹mxe›/usr/i686-pc-mingw32/qt5/lib/). Оба способа приводят к одному и тому же сообщению при попытке запустить скомпилированное приложение: Это приложение запросило среду выполнения, чтобы завершить его необычным образом. Используя отладчик Visual Studio, я вижу два сообщения о том, что недопустимый параметр передан функции времени выполнения C. Следующим шагом, который я хотел попробовать, является компиляция Qt и приложения в режиме отладки, но у меня не было на это времени. - person Ratatwisker; 03.03.2013

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

sudo apt-get install wine

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

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

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

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

person Min Lin    schedule 01.04.2013
comment
Что такое jom и что означает offline в имени? - person tshepang; 01.04.2013
comment
jom эквивалентен make, замените make на jom -j N, чтобы запустить N параллельных процессов, чтобы сделать ваш проект. offline - это просто название установщика QtSDK, я думаю, это означает, что у установщика есть все, что вам нужно, и он может установить qt, когда у вас нет подключения к Интернету. - person Min Lin; 01.04.2013

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

person Greg Pazo    schedule 27.03.2013

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

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

person drew212    schedule 20.02.2013