Anhängen an CMAKE_C_FLAGS

Lesezeit: 3 Minuten

Benutzer-Avatar
TobiSF

Ich verwende CMake für ein Projekt, das in zwei Versionen erhältlich ist, von denen eine -lglapi erfordert und die andere nicht.

Bisher sahen die von uns verwendeten Zeilen so aus:

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

Ich habe eine if-Anweisung in meiner CMakeList.txt genau nach diesen Zeilen hinzugefügt:

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

Die Variable SINGLE_MODE ist etwas höher definiert. Wenn ich den Nachrichtenbefehl verwende, um den Inhalt der Flag-Variablen anzuzeigen, sieht es gut aus:

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

Aber wenn ich mit dem Kompilieren beginne, tritt ein Kompilierungsfehler auf. Mit dem ausführlichen Modus habe ich festgestellt, dass es im Compiler-Aufruf so aussieht:

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

Das heißt, irgendwie wurde ein Semikolon hinzugefügt, bevor das -lglapi zur Liste hinzugefügt wurde.

Hatte hier jemand ein ähnliches Problem und kennt eine Möglichkeit, dieses Problem zu beheben? Ich habe eine ganze Weile gegoogelt und das CMake-Handbuch studiert, konnte aber nicht sehen, was ich hier falsch gemacht habe.

Danke, Tobias

  • Hast du versucht SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -lglapi")?

    – jpo38

    27. April 2015 um 16:42 Uhr

  • @jpo38 Sie sollten eine Antwort geben und Ihren verdienten Ruf bekommen 🙂

    – Antonio

    27. April 2015 um 16:46 Uhr

  • @jpo38, danke. Das hat funktioniert. Daran hätte ich selbst denken sollen, aber wenn man etwas zu lange betrachtet, wird man dafür irgendwie blind.

    – TobiSF

    27. April 2015 um 16:47 Uhr

  • Vielen Dank. Da ich auf meinem aktuellen Rechner kein CMake installiert habe, konnte ich nicht testen. Bevor Sie eine ungetestete Antwort posten, möchten Sie lieber Ihr Feedback haben, um keine Ablehnungen zu erhalten ….;-). Jetzt bereit für Upvotes!

    – jpo38

    27. April 2015 um 16:50 Uhr


Versuchen Sie stattdessen Folgendes:

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 anhängen -lglapi zum Bestehenden ${CMAKE_CXX_FLAGS} Schnur. Ansonsten sieht es so aus, als würde so etwas wie eine CMake-Liste erstellt.

  • Das ist sehr Boilerplate. Gibt es eine kürzere Lösung?

    – nowox

    31. August 2017 um 6:45 Uhr

  • @nowox: Mir ist nichts bekannt

    – jpo38

    31. August 2017 um 6:51 Uhr

  • Oh 🙁 Ich kenne CMake nicht wirklich, aber ist es nicht möglich, es zu verwenden list(APPEND?

    – nowox

    31. August 2017 um 6:52 Uhr

Seit CMake 3.4 Sie machen:

string(APPEND CMAKE_CXX_FLAGS " -lglapi")

Dies ist sehr praktisch, wenn Sie die Flags nur für eine Sprache setzen möchten (C++ im obigen Beispiel), aber wenn Sie die gleichen Flags für alle Sprachen setzen möchten, können Sie einfach Folgendes tun:

add_compile_options(-lglapi)

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

target_compile_options(my_lib PUBLIC -lglapi)

Flaggen auf einem Ziel können entweder sein ÖFFENTLICH, PRIVAT oder SCHNITTSTELLEwodurch die Flags transitiv von einem Ziel zum anderen weitergeleitet werden können.

Nur für den besonderen Fall, in dem Sie Compiler- und Linker-Optionen hinzufügen möchten (wie für die Option –coverage), fügt die folgende Syntax die Flags sowohl zum Linker als auch zum Compiler hinzu:

SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} --coverage")
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} --coverage")

(Die obigen Befehle fügen die Option –coverage sowohl den Compiler- als auch den Flag-Optionen für C und C++ hinzu.)

Andernfalls, wenn Sie es vorziehen, neue CMake-Befehle (add_compile_options und add_link_options) zu verwenden, vergessen Sie nicht, auch die Linker-Option hinzuzufügen:

add_compile_options(--coverage)
add_link_options(--coverage)

(Die obigen Befehle fügen die Option –coverage sowohl den Compiler- als auch den Flag-Optionen für C und C++ hinzu.)

1352120cookie-checkAnhängen an CMAKE_C_FLAGS

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy