web-dev-qa-db-fra.com

Différence entre add_compile_options et SET (CMAKE_CXX_FLAGS ...)

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?

22
jww
  • 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() et add_definitions()) ou inclure des répertoires (target_include_directories() et include_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.

26
usr1234567