web-dev-qa-db-fra.com

Ajout à CMAKE_C_FLAGS

J'utilise CMake pour un projet qui se décline en deux versions, dont l'une nécessite -lglapi et l'autre non.

Jusqu'à présent, les lignes que nous avons utilisées ressemblent à ceci:

SET(CMAKE_C_FLAGS "-O3 -xSSE3 -restrict -lpthread -lX11 -ldrm")
SET(CMAKE_CXX_FLAGS "-O3 -xSSE3 -restrict -lpthread -lX11 -ldrm")

J'ai ajouté une instruction if dans mon CMakeList.txt exactement après ces lignes:

if(SINGLE_MODE)
    SET(CMAKE_C_FLAGS ${CMAKE_C_FLAGS} " -lglapi")
    SET(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} " -lglapi")
endif(SINGLE_MODE)

La variable SINGLE_MODE est définie un peu plus haut. Lorsque j'utilise la commande message pour afficher le contenu des variables d'indicateur, cela semble correct:

-O3 -xSSE3 -restrict -lpthread -lX11 -ldrm -lglapi

Mais lorsque je commence à compiler, je rencontre une erreur de compilation. En utilisant le mode verbeux, j'ai réalisé que dans l'appel du compilateur, cela ressemble à ceci:

-O3 -xSSE3 -restrict -lpthread -lX11 -ldrm; -lglapi

C'est à dire. en quelque sorte un point-virgule a été ajouté avant d'ajouter le -lglapi à la liste.

Quelqu'un ici a-t-il rencontré un problème similaire et connaît un moyen de résoudre ce problème? J'ai googlé un bon moment et étudié le manuel de CMake mais je n'ai pas pu voir ce que j'ai fait de mal ici.

Merci Tobias

17
TobiSF

Essayez plutôt de faire ceci:

if(SINGLE_MODE)
    SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -lglapi")
    SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -lglapi")
endif(SINGLE_MODE)

Ensuite, vous êtes sûr d'ajouter -lglapi à l'existant ${CMAKE_CXX_FLAGS} chaîne. Sinon, on dirait que quelque chose comme une liste CMake est en cours de création.

25
jpo38

Depuis CMake 3.4 vous faites:

string(APPEND CMAKE_CXX_FLAGS " -lglapi")

C'est très pratique lorsque vous souhaitez définir les indicateurs uniquement pour une langue (C++ dans l'exemple ci-dessus), mais si vous souhaitez définir les mêmes indicateurs pour toutes les langues, vous pouvez simplement faire:

add_compile_options(-lglapi)

Les deux commandes modifient les indicateurs pour l'ensemble du répertoire, si vous souhaitez définir les indicateurs pour une seule cible, procédez comme suit:

target_compile_options(my_lib PUBLIC -lglapi)

Les drapeaux sur une cible peuvent être PUBLIC, PRIVATE ou INTERFACE , permettant de transmettre de manière transitoire les drapeaux d'une cible à l'autre.

9
Benoit Blanchon