web-dev-qa-db-fra.com

#ifdef DEBUG avec CMake indépendant de la plateforme

J'utilise CMake pour construire mes projets sur Windows (Visual Studio) ainsi que sur les machines Linux (gcc). Je voudrais marquer du code comme "débogage uniquement", comme avec

#ifdef DEBUG
//some logging here
#endif

La question est: quelle définition de compilateur est disponible sur toutes les plateformes dans le type de build CMake "Debug"? DEBUG ne semble pas exister. (Je veux avoir la journalisation ou autre chose uniquement lorsque le type de build est Debug.)

30
Philipp

CMake ajoute -DNDEBUG au CMAKE_C_FLAGS_ {RELEASE, MINSIZEREL} par défaut. Vous pouvez donc utiliser #ifndef NDEBUG.

87
arrowd

Je suggère que vous ajoutiez votre propre définition. Le symbole CMakeCMAKE_C_FLAGS_DEBUG peut contenir des indicateurs uniquement utilisés en mode débogage. Par exemple:

C:

set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -DMY_DEBUG")

C++:

set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -DMY_DEBUG")

Dans votre code, vous pouvez ensuite écrire ce qui suit:

#ifdef MY_DEBUG
// ...
#endif

(Vous devrez peut-être utiliser "/DMY_DEBUG" pour visual studio.)

23
Lindydancer

Dans CMake> = 2.8, utilisez target_compile_definitions :

target_compile_definitions(MyTarget PUBLIC "$<$<CONFIG:DEBUG>:DEBUG>")

Lors de la compilation en mode débogage, cela définira le symbole DEBUG à utiliser dans votre code. Cela fonctionnera même dans les IDE comme Visual Studio et Xcode pour lesquels cmake génère un seul fichier pour tous les modes de compilation.

Vous devez le faire pour chaque cible [1]. Vous pouvez également utiliser add_compile_options (Cmake> = 3.0):

add_compile_options("$<$<CONFIG:DEBUG>:-DDEBUG>")

Notez que les versions récentes de Visual C++ (au moins depuis VS2015) autorisent soit/ou - pour les paramètres, donc cela devrait fonctionner correctement entre les compilateurs. Cette commande est également utile pour d'autres options de compilation que vous aimeriez ajouter ("/ O2" en mode de publication pour MSVC ou "-O3" pour le mode de publication en G ++/Clang)

[1]: Remarque: dans CMake> = 3.12 (actuellement en version bêta), il existe également un add_compile_definitions qui prend en charge les expressions de générateur, ce qui affecte toutes les cibles.

8
jtbr