2015-04-27 12 views
10

Ich verwende CMake für ein Projekt, das in zwei Versionen kommt, von denen die eine -lglapi und die andere nicht benötigt.Anhängen an CMAKE_C_FLAGS

Bisher sind die Linien benutzten wir sehen wie folgt aus:

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

ich eine zusätzliche if-Anweisung in meiner CMakeList.txt genau nach diesen Zeilen:

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

Die SINGLE_MODE Variable ist ein wenig definiert oben. Als ich die Nachricht Befehl den Inhalt der Flag-Variablen angezeigt werden es in Ordnung aussieht:

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

Aber wenn ich kompilieren beginne ich in einen Compiler-Fehler leite. Mit dem ausführlichen Modus erkannte ich, dass es im Compiler-Aufruf so aussieht:

I.e. Irgendwie wurde ein Semikolon hinzugefügt, bevor das -lglapi zur Liste hinzugefügt wurde.

Hat jemand hier auf ein ähnliches Problem gestoßen und weiß, wie man dieses Problem beheben kann? Ich habe eine ganze Weile gegoogelt und das CMake-Handbuch studiert, konnte aber nicht sehen, was ich hier falsch gemacht habe.

Danke, Tobias

+4

Haben Sie 'SET (CMAKE_CXX_FLAGS" $ {CMAKE_CXX_FLAGS} -lglapi ")'? – jpo38

+0

@ jpo38 Sie sollten eine Antwort geben und Ihren verdienten Ruf bekommen :) – Antonio

+0

@ jpo38, danke. Das hat den Trick gemacht. Daran hätte ich selbst denken müssen, aber nachdem ich etwas zu lange angeschaut habe, bist du dafür blind geworden. – TobiSF

Antwort

14

Versuchen Sie stattdessen zu tun:

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

Dann sind Sie sicher, dass Sie -lglapi an die bestehende ${CMAKE_CXX_FLAGS} String anhängen. Sonst sieht so etwas wie eine CMake-Liste aus.

+0

Dies ist sehr Standard. Gibt es eine kürzere Lösung? – nowox

+0

@nowox: Nicht irgendwelche, die ich kenne – jpo38

+0

Oh :(Ich weiß nicht wirklich CMake, aber ist es nicht möglich, 'list (APPEND'? – nowox

0

Seit CMake 3.4 Sie tun:

string(APPEND CMAKE_CXX_FLAGS " -lglapi") 

Diese sehr praktisch, wenn Sie die Flaggen für nur festlegen möchten eine Sprache (C++ in dem obigen Beispiel), aber wenn Sie möchten die gleichen Flaggen für alle Sprachen einzustellen Sie können einfach tun:

add_compile_options(-lglapi) 

Beide Befehle die Flags für das gesamte Verzeichnis zu ändern, wenn Sie die Flaggen für nur ein Ziel festlegen möchten, tun:

target_compile_options(my_lib PUBLIC -lglapi) 

Flags auf einem Ziel können entweder PUBLIC, PRIVATE or INTERFACE sein, um die Flags von einem Ziel zum anderen transitiv weiterzuleiten.