Cette question est liée à Demander à Cmake d'utiliser CXX et CXXFLAGS lors de la conduite du lien? Dans la question précédente, nous essayons de demander à CMake d'utiliser CXXFLAGS
lorsqu'il invoque l'éditeur de liens.
add_compile_options
Nous avons constaté que le code suivant
if (CMAKE_VERSION VERSION_LESS 2.8.12)
add_definitions(-foo)
else()
add_compile_options(-foo)
endif()
message(STATUS, "CXXFLAGS: ${CMAKE_CXX_FLAGS}")
produit la sortie
CXXFLAGS:
SET CMAKE_CXX_FLAGS
Nous avons constaté que le code suivant
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -foo" )
message(STATUS, "CXXFLAGS: ${CMAKE_CXX_FLAGS}")
produit la sortie
CXXFLAGS: -foo
Questions
Nous avons découvert que CMake créerait des fichiers objets en utilisant -foo
dans les deux cas. Alors -foo
fait définitivement son chemin dans CXXFLAGS
.
Quelle est la différence entre le premier ensemble de code CMake et le deuxième ensemble de code CMake?
Pourquoi est-ce CMAKE_CXX_FLAGS
non défini dans une instance et défini dans l'autre instance?
CMAKE_CXX_FLAGS
Est utilisé pour ajouter des indicateurs pour toutes les cibles C++. C'est pratique pour transmettre des arguments généraux tels que les niveaux d'avertissement ou les normes C++ requises sélectionnées. Il n'a aucun effet sur les cibles C ou Fortran et l'utilisateur peut passer des drapeaux supplémentaires.
add_compile_options
Ajoute les options à toutes les cibles du répertoire et de ses sous-répertoires. C'est pratique si vous avez une bibliothèque dans un répertoire et que vous souhaitez ajouter des options à toutes les cibles liées à la bibliothèque, mais sans rapport avec toutes les autres cibles. De plus, add_compile_options
Peut gérer des arguments avec expressions de générateur. documentation indique explicitement que
Cette commande peut être utilisée pour ajouter des options, mais des commandes alternatives existent pour ajouter des définitions de préprocesseur (
target_compile_definitions()
etadd_definitions()
) ou inclure des répertoires (target_include_directories()
etinclude_directories()
).
add_definitions
Est destiné à transmettre des valeurs de pré-processeur du type -DFOO -DBAR=32
(/D
Sous Windows) qui définit et définit des variables de pré-processeur. Vous pouvez passer n'importe quel indicateur, mais les indicateurs du formulaire ci-dessus sont détectés et ajoutés à la propriété [COMPILE_DEFINITIONS][2]
, Que vous pourrez ensuite lire et modifier. Ici, vous pouvez également utiliser des expressions de générateur . Le documentation mentionne les étendues pour les répertoires, les cibles et les fichiers source.Pour une cible donnée, CMake collectera tous les drapeaux de CMAKE_CXX_FLAGS
, De la cible et du répertoire COMPILE_DEFINITIONS
Et de tous add_compile_options
Qui affectent la cible.CMAKE_CXX_FLAGS
Ne sont pas modifiés par les autres commandes ou vice versa. Cela violerait la portée de ces commandes.