cmake variable scope, add_subdirectory

75

Ich habe eine CMakeLists.txt in meinem Projektstamm und eine in meinem / src-Ordner. Die im Ordner / src enthält nur eine Variable mit den CPP-Dateien ( set (SOURCEFILES main.cpp foo.cpp)) und in der Stammdatei CMakeLists.txt, die ich add_subdirectory(src)und später mache add_executable(MyApp ${SOURCEFILES}).

Aber cmake gibt mir den Fehler

add_executable wird mit falscher Anzahl von Argumenten aufgerufen, keine Quellen angegeben

Wie kann ich cmake dazu bringen, die Variable zu sehen? Ich habe gelesen, dass cmake nur globale Variablen kennt, aber das ist offensichtlich nicht der Fall ...

blubberbernd
quelle

Antworten:

113

Wie in der Dokumentation des Befehls set erwähnt , erstellt jedes mit add_subdirectoryoder jede mit deklarierte Funktion hinzugefügte Verzeichnis functioneinen neuen Bereich.

Der neue untergeordnete Bereich erbt alle Variablendefinitionen von seinem übergeordneten Bereich. Variablenzuweisungen im neuen untergeordneten Bereich mit dem setBefehl werden nur im untergeordneten Bereich angezeigt, sofern die PARENT_SCOPEOption nicht verwendet wird.

SOURCEFILESVersuchen Sie Folgendes, um die Zuordnung im Stammordner Ihres Projekts sichtbar zu machen :

set (SOURCEFILES main.cpp foo.cpp PARENT_SCOPE) 
Sakra
quelle
5
Danke, das hat es gelöst. Aber noch ein Hinweis: Im Unterverzeichnis müssen Sie jetzt ${CMAKE_CURRENT_SOURCE_DIR}/foo.cppstatt nur verwenden, foo.cppweil sich cmake jetzt im übergeordneten Bereich befindet.
blubberbernd
2
Alternativ können Sie die Variable in der übergeordneten Datei CMakeLists.txt vor dem Aufruf von add_subdirectory festlegen und ihre Definition bis zur untergeordneten Datei CMakeLists erben lassen. Auch hier müssen Sie die Namen der Dateien qualifizieren, wenn Sie aus mehreren CMakeLists-Dateien auf sie verweisen müssen.
DLRdave
8
Sie müssen die Variable auch im aktuellen Bereich erstellen, um ihre Werte im Unterverzeichnis / in der Funktion zu verwenden:set(VAR value PARENT_SCOPE); set(VAR ${VAR});
Patrick B.
9
@PatrickB. in meinem Fall set(VAR value PARENT_SCOPE); set(VAR ${VAR});funktioniert nicht, funktioniert aber set(VAR value); set(VAR ${VAR} PARENT_SCOPE);.
Deqing
5
Zusätzlich können Sie vom übergeordneten Verzeichnis auf eine bestimmte Variable in suddir wie folgt zugreifenget_directory_property(VAR1 DIRECTORY subdir1 DEFINITION VAR1)
Maxim