2011-07-31 11 views
52

Mam plik CMakeLists.txt w katalogu głównym projektu i jeden w folderze my/src. Ten w folderze/src zawiera tylko zmienną z plikami .cpp (set (SOURCEFILES main.cpp foo.cpp)), a w katalogu głównym CMakeLists.txt robię add_subdirectory(src), a później robię add_executable(MyApp ${SOURCEFILES}).Zasięg zmienny cmake, add_subdirectory

Ale cmake daje mi błąd

add_executable wywołana z nieprawidłową liczbą argumentów, żadnych źródeł przewidziane

Jak uzyskać cmake zobaczyć zmienną? Czytałem, że CUpewnij wie tylko zmienne globalne, ale nie jest to oczywiście przypadek ...

Odpowiedz

78

Jak wspomniano w dokumentacji Command set, każdy katalog dodano add_subdirectory lub każda funkcja zadeklarowana z function tworzy nowy zakres.

Nowy zakres podrzędny dziedziczy wszystkie definicje zmiennych z zakresu nadrzędnego. Przypisania zmiennych w nowym zakresie podrzędnym za pomocą komendy set będą widoczne tylko w zasięgu podrzędnym, o ile nie zostanie użyta opcja PARENT_SCOPE.

Aby przyporządkowanie SOURCEFILES widoczny w folderze głównym projektu, spróbuj:

set (SOURCEFILES main.cpp foo.cpp PARENT_SCOPE) 
+2

Dzięki, to rozwiązać go. Ale kolejna uwaga: w katalogu podrzędnym trzeba teraz użyć '$ {CMAKE_CURRENT_SOURCE_DIR}/foo.cpp' zamiast tylko' foo.cpp', ponieważ cmake znajduje się teraz w zasięgu nadrzędnym. – blubberbernd

+2

Alternatywnie można ustawić zmienną w nadrzędnym pliku CMakeLists.txt przed wywołaniem add_subdirectory, a jej definicja dziedziczy do pliku potomnych CMakeLists. Ponownie, musisz zakwalifikować nazwy plików, jeśli chcesz odwołać się do nich z wielu plików CMakeLists. – DLRdave

+5

Musisz utworzyć zmienną również w zakresie bieżącym, aby użyć jej wartości w podkatalogu/funkcji: 'set (VAR value PARENT_SCOPE); set (VAR $ {VAR}); ' –