MyTetra Share
Делитесь знаниями!
Сборка 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



Так же в этом разделе:
 
MyTetra Share v.0.59
Яндекс индекс цитирования