|
|||||||
Сборка Qt-программ с использованием qmake с учетом целевой платформы
Время создания: 20.03.2016 22:41
Автор: xintrea
Текстовые метки: qt, qmake, переменная, мультиплатформенность, define, синтаксис *.pro файла, win32, mac, unix, android
Раздел: Компьютер - Программирование - Язык C++ (Си++) - Библиотека Qt - Инсталляция Qt и сборка проектов
Запись: xintrea/mytetra_syncro/master/base/0000003452/text.html на raw.github.com
|
|||||||
|
|||||||
Иногда при компиляции программы в C++ коде нужно учесть, под какую операционку компилируется программа. У разных операционок разные требования к размещениям файлов исполнимых бинарников и файлов данных пользователя. Здесь рассказвается, как можно учитывать эти особенности. В качестве примера используется сборка под десктопные ОС Windows и Linux, MeeGo, Андроид. Основная идея - использовать внутри *.pro файла специальную переменную, которая будет указывать на то, под какую платформу идет сборка. В самом начале файла можно прописать инициализацию переменной TARGET_OS, которая далее используется в *.pro файле. При начале компиляции под конкретную платформу, необходимо задать нужное значение этой переменной: # Please, set manual your target OS # ANY_OS - for any desktop Windows and Linux OS # MEEGO_OS - for MEEGO # ANDROID_OS - for Android TARGET_OS=ANY_OS Далее в *.pro-файле можно прописать определения (дефайны) которые при компиляции попадут в C++ код: # Create define variable in C++ code DEFINES+="ANY_OS=1" DEFINES+="MEEGO_OS=2" DEFINES+="ANDROID_OS=3" Такая запись эквивалентна тому, что мы в главном заголовочном h-файле пропишем: #define ANY_OS 1 #define MEEGO_OS 2 #define ANDROID_OS 3 А далее в *.pro-файле мы проделываем следующий хинт: DEFINES+="TARGET_OS=$${TARGET_OS}" Такая запись эквивалентна тому, что мы в главном заголовочном h-файле пропишем определение TARGET_OS, которое будет проинициализировано значением переменной TARGET_OS, заданным в *.pro файле: #define TARGET_OS ANY_OS А так как значение определения ANY_OS уже известно (и равно 1), то компилятор нормально обработает эту строку. Таким образом, внутри *.pro файла мы оперируем переменной TARGET_OS, которая может принимать значения ANY_OS, MEEGO_OS, ANDROID_OS. А внутри C++ кода мы так же имеем определение TARGET_OS, которое может принимать значения ANY_OS, MEEGO_OS, ANDROID_OS (за которыми компилятор видит числа 1, 2, 3). В *.pro файле мы можем проверять значение TARGET_OS и выполнять соответствующие действия. Производится это с помощью конструкции contains(): contains(TARGET_OS, ANY_OS) { message(Building the any OS version...) SYSTEM_PROGRAM_NAME=mytetra BINARY_INSTALL_PATH=/usr/local/bin } contains(TARGET_OS, MEEGO_OS){ message(Building the MeeGo OS version...) SYSTEM_PROGRAM_NAME=ru.webhamster.mytetra BINARY_INSTALL_PATH=/opt/$${SYSTEM_PROGRAM_NAME}/bin } contains(TARGET_OS, ANDROID_OS){ message(Building the Android OS version...) SYSTEM_PROGRAM_NAME=mytetra BINARY_INSTALL_PATH=/ } В C++ коде можно узнавать, под какую платформу нужно включать код, через следующую конструкцию: #if TARGET_OS==ANY_OS ... какой-то код ... #endif #if TARGET_OS==MEEGO_OS ... какой-то код ... #endif #if TARGET_OS==ANDROID_OS ... какой-то код ... #endif |
|||||||
Так же в этом разделе:
|
|||||||
|
|||||||
|