Comment ajouter une définition avec qmake AVEC une valeur:
Par exemple, cela ne fonctionne pas (comme prévu) dans mon fichier .pro:
DEFINES += WINVER 0x0500
ni
DEFINES += "WINVER 0x0500"
Comment définir WINVER en tant que 0x0500 avant que quoi que ce soit ne commence à compiler pour que sa définition ne soit en aucune manière affectée par la compilation ou l'include
DEFINES += "WINVER=0x0500"
fonctionne pour moi.
De cette façon, -DWINVER=0x0500
est ajouté à la ligne de commande du compilateur, qui correspond à la syntaxe attendue par GCC/mingw pour les définitions de pré-processeur en ligne de commande (voir ici pour les détails).
DEFINES += MY_DEF=\\\"String\\\"
Ce format doit être utilisé lorsque l’on veut faire remplacer la macro par un élément string
En tant qu’additif, si vous souhaitez exécuter du code Shell au lieu de définir une constante (par exemple, pour obtenir un numéro de version ou une date):
Utilisez soit $$system()
. Ceci est exécuté quand qmake est exécuté:
DEFINES += GIT_VERSION=$$system(git describe --always)
Ou utilisez $()
si le code doit être exécuté sur chaque compilation (c'est-à-dire lorsque le fichier makefile est exécuté) . Pour DEFINES
, vous devez échapper à la commande si elle contient des espaces, sinon qmake insère les -D
non désirés:
DEFINES += GIT_VERSION='$(Shell git describe --always)'
Ce sera ensuite copié littéralement dans le fichier makefile.
Si la sortie de la commande contient des espaces, vous avez besoin d'une autre couche d'échappement (cette fois pour make):
DEFINES += BUILD_DATE='"$(Shell date)"'
Si vous avez besoin de guillemets autour de votre valeur pour obtenir une chaîne, cela devient un peu moche:
DEFINES += BUILD_DATE='"\\\"$(Shell date)\\\""'
Je recommanderais d'utiliser l'opération de pré-traitement stringify des préprocesseurs dans ce cas:
#define _STR(x) #x
#define STR(X) _STR(x)
printf("this was built on " STR(BUILD_DATE) "\n");
La réponse de Greg fonctionne très bien dans un fichier .pro. Cependant, lorsque vous appelez qmake depuis la ligne de commande, je devais laisser les espaces, c’est-à-dire utiliser comme ce qui suit, pour faire un travail de définition:
qmake DEFINES+="WINVER 0x0500"
#define STRING "Valeur avec espaces" à partir du fichier Qt * .PRO:
Pour ajouter un #define STRING "Valeur avec espaces" à partir du fichier de projet QT, nous avons dû écrire:
DEFINES += "VERSION_LOG=\"\\\"Version 2.5.1\\\"\""
DEFINES += "VERSION_QT=\"\\\"Qt 5.10\\\"\""
qui donne dans le fichier Makefile.Release:
DEFINES = -DUNICODE -D_UNICODE -DVERSION_LOG="\"Version 2.5.1\"" -DVERSION_QT="\"Qt 5.10\"" -DQT_NO_DEBUG [...]
En résumé, sur cette ligne: DEFINES += "VERSION_LOG=\"\\\"Version 2.5.1\\\"\""
Le premier et dernier "
indique à QMake de lire la phrase entière sous forme de chaîne
Le premier et dernier \"
écrit le premier et dernier "
dans -DVERSION_LOG="\"Version 2.5.1\""
Le premier et dernier \\\"
écrit un \
puis un "
dans -DVERSION_LOG="\"Version 2.5.1\""
Si vous souhaitez définir un littéral de chaîne à utiliser dans Objective-C, vous devez vous rappeler le @ avant les guillemets.
DEFINES += MY_DEF='@\\"string-literal\\"'