Лучшие практики для кроссплатформенной разработки с Qt - PullRequest
32 голосов
/ 29 января 2011

Согласно qt.nokia.com , Qt является «кроссплатформенным каркасом приложений и пользовательского интерфейса», позволяющим вам «писать код один раз для нескольких платформ».Qt SDK - это «полная среда разработки», содержащая «инструменты, необходимые для создания кроссплатформенных приложений с использованием Qt за одну установку».Qt Creator - это «кроссплатформенная IDE», которая «работает в операционных системах Windows, Linux / X11 и Mac OS X для настольных ПК и позволяет разработчикам создавать приложения для нескольких платформ настольных компьютеров и мобильных устройств».

Волшебные слова "кросс-компиляция" явно не упоминаются на этих сайтах.Тем не менее, наивный читатель может быть прощен за вывод, что вы можете скачать Qt SDK (включая Qt Creator) для любой хост-системы, которую вы используете для разработки, создать проект и написать некоторый код, из которого вы могли бы легко генерировать исполняемые файлы для Windows, Linux, Mac и т. д. Под «легкостью» я имею в виду что-то вроде установки флажков в диалоговом окне настроек сборки и нажатия кнопки «Сборка».

Я все еще ищудля этих флажков!Между тем, я нашел различные посты, здесь и в других местах, об установке кросс-компилятора, установке дополнительных двоичных файлов, переписывании вашего файла qmake и т. Д. Из маркетинга я ожидал, что кросс-компиляция уже будет полностью и напрямую поддерживаться с помощью«готовая» установка инструментов IDE и SDK.Я что-то упускаю из виду?

Если нет, у меня есть машины для разработки со всеми тремя операционными системами.Должен ли я просто установить Qt Creator на всех трех платформах?Если я сделаю это, могу ли я ожидать, что смогу взять проект Qt (или, может быть, просто исходный код), который я разработал с использованием, например, Qt Creator для Windows, скопировать его на мой компьютер Mac или Linux и собрать еготам использовать версию Qt Creator для этой платформы, не сталкиваясь с некоторыми серьезными проблемами?Может ли это быть даже лучшей практикой использования Qt для создания исполняемых файлов для нескольких платформ по сравнению с установкой инструментов кросс-компиляции на одном хосте разработки?

Ответы [ 6 ]

22 голосов
/ 31 января 2011

Слоган Qt:

Пишите один раз, компилируйте везде.

Имея это в виду, Qt официально не предлагает готового решения для кроссакомпиляция приложений Qt с конкретной платформы на другие платформы.Несмотря на то, что Qt, безусловно, выполнимо, если потратить много времени и усилий, хорошая общая практика предложит вам создать приложение Qt непосредственно на целевой платформе.Это означает, что создайте свою цель Windows для своего приложения на машине Windows, свою цель Mac на машине Mac и цель Linux на, как вы уже догадались (:-)), машину Linux.

Это так«Пиши один раз, собирай везде», на мой взгляд, очень удачно подобранная комбинация слов.В противном случае строка тэга могла бы звучать так: «Пиши один раз, компилируй для всего».

Возвращаясь к исходному вопросу, вам даже не понадобятся разные физические машины для каждой целевой платформы, поскольку в этот деньи век хороших решений для виртуализации вы можете легко настроить пару виртуальных машин и создать приложение на разных платформах с одной и той же физической машины.

Что касается других вопросов, на которые ваш вопрос не получил прямого ответа:

Должен ли я просто установить Qt Creator на всех трех платформах?Если я сделаю это, могу ли я ожидать, что смогу взять проект Qt (или, может быть, просто исходный код), который я разработал с использованием, например, Qt Creator для Windows, скопировать его на мой компьютер Mac или Linux и собрать еготам используется версия Qt Creator для этой платформы, без каких-либо серьезных проблем?

Да.Незначительные проблемы, такие как получение значков исполняемых / двоичных файлов ваших приложений прямо на всех трех основных платформах (Windows, Linux, Mac) или расширенная интеграция с док-станцией Mac Dock или панель задач Проблемы интеграции между ними.Эти проблемы можно решить, не нарушая кросс-платформенную характеристику вашего кода, путем правильной инкапсуляции кода, специфичного для вашей платформы, в директивах компилятора, таких как, например, #define.Я также рекомендую делать это для каждого кода, специфичного для конкретной платформы, который требуется вашему приложению, или если вы будете широко использовать код, специфичный для платформы, разделив целые блоки кода, относящегося к конкретной платформе, на несколько динамически загружаемых библиотек (или общих библиотек), специфичных для каждой платформы, ноэкспорт того же абстрактного универсального интерфейса и загрузка / связывание с ними по мере необходимости.

Возможно, это даже лучший способ использования Qt для создания исполняемых файлов для нескольких платформ вместо установки инструментов кросс-компиляции наодин узел разработки?

Вы должны использовать Qt SDK (Qt Creator или инструменты командной строки) для сборки вашего приложения везде, где это возможно, поскольку такие инструменты, как qmake, возьмут на себя бремя обработки файлов .moc вручную в вашемMakefiles.Но если это становится невозможным по нескольким причинам, например.Как ваша компания навязывает разработку Visual Studio (кросс-платформенный, да?), есть много учебников о том, как обрабатывать сборки на основе Qt с использованием систем сборки, таких как MS Visual Studio, GNU autotools или CMake.Хотя я бы порекомендовал придерживаться qmake, который является хорошим генератором «make makefile» и легко адаптируется под любые хаки для конкретных платформ, которые могут понадобиться вашему приложению для правильной сборки, вместо того, чтобы использовать систему сборки, которая более удобна для хаков для конкретной платформы.и затем пытается удовлетворить потребности Qt в этих системах сборки.В конце концов, если вы разрабатываете свое приложение на Qt по кроссплатформенным причинам, то Qt должен быть основной платформой для вашего приложения, а не API / кодом для конкретной платформы или сторонними библиотеками, которые вы могли бы использовать.

Я надеюсь, что ябыли достаточно ясны и полезны.

PS: Я также приветствую предложения или исправления / дополнения относительно того, что я написал в комментариях.

6 голосов
/ 30 января 2011

Вы можете использовать MinGW для кросс-компиляции в Linux для Windows. Кросс-компиляция на Mac невозможна из-за технических проблем. Нет простого способа сделать это из графического интерфейса, но здесь - это хорошее руководство по кросс-компиляции QtWebKit для Windows. Это может быть применено к любому проекту Qt.

3 голосов
/ 30 января 2011

Я не думаю, что есть конфигурация кросс-компиляции.

О переносимости всего проекта я бы сказал «почти», потому что обнаружил несколько неприятных глюков. Тем не менее ваш исходный код будет на 100% переносимым, а перекомпиляция на другой платформе просто потребует некоторых уловок в .pro.

Что я делаю, так это работаю только с одной платформой (Linux) и время от времени компилирую, используя мой компьютер с Windows и мой Mac Mini. С чем я обычно борюсь, это всего лишь несколько указаний о том, где искать внешние библиотеки или включать файлы. Также при работе на Mac я должен копировать внешние файлы в комплекте приложений, чтобы программа могла их найти.

2 голосов
/ 30 января 2011

Я не знаю о системах Linux.Но для разработки приложения Qt для Mac OS X и Windows вам понадобится компьютер для разработки каждого из них.Для них нет кросс-компиляции.

Qt является кроссплатформенным в том смысле, что одни и те же исходные файлы могут создавать приложения для разных платформ.Со всеми доступными виртуальными машинами настройка одного (физического) компьютера для разработки и построения нескольких целей не должна быть слишком большой проблемой.На самом деле, именно так я и работаю над своим текущим проектом, ориентированным как на Mac, так и на Windows.

2 голосов
/ 30 января 2011

В прошлый раз, когда я использовал Qt, и это было много лет назад, вам приходилось компилировать на каждой платформе, для которой вы хотели двоичный файл.Конечно, вы могли бы сделать кросс-компиляцию, но я думаю, что это будет зависеть от вас, чтобы настроить такую ​​вещь.

Может быть, кто-то еще задаст лучший вопрос, но я не думаю, что вы что-то упускаете.

1 голос
/ 01 февраля 2011

Кросс-компиляция обычно используется для разработки программного обеспечения в хост-системе Linux и компиляции для целевой системы Linux.В течение многих лет я использовал систему Linux, работающую на x86 с X11 (KDE), для кросс-компиляции нашего приложения Qt для встроенной системы ARM под управлением Qt Embedded.Если вы работаете с мобильными приложениями, вы, вероятно, кросс-компилируете.Конечно, вы можете выполнять кросс-компиляцию в системе Windows.Все, что вам действительно нужно, это кросс-компилятор.Поскольку gcc доступен в исходном коде, кросс-компиляторы gcc довольно распространены.Чтобы выполнить кросс-компиляцию с помощью Qt, вам нужен mkspec для qmake, который указывает, какие компиляторы использовать.

В последнем абзаце указано, что вы, вероятно, не сможете выполнять этот тип кросс-компиляции.сделайте это на своем компьютере с Windows для Linux или, возможно, для Mac, и вы, вероятно, можете сделать это на Linux для Windows, если вы используете версию Qt mingw для Windows, но вы никогда не скомпилируете приложение на основе компилятора Microsoft наLinux или Mac для Windows.

Итог - делайте то, что вы указали.Получите ваш источник на каждой целевой платформе и скомпилируйте его там.

...