cmake область змінної, add_subdirectory


76

У мене є CMakeLists.txt у корені мого проекту та один у моїй папці / src. У папці / src міститься лише змінна з файлами .cpp ( set (SOURCEFILES main.cpp foo.cpp)) і в кореневому CMakeLists.txt, що я роблю, add_subdirectory(src)а пізніше - роблю add_executable(MyApp ${SOURCEFILES}).

Але cmake видає мені помилку

add_executable викликається з неправильною кількістю аргументів, джерела не надано

Як отримати cmake, щоб побачити змінну? Я читав, що cmake знає лише глобальні змінні, але це, очевидно, не так ...

Відповіді:


114

Як згадувалося в документації команди set , кожен каталог, доданий за допомогою add_subdirectoryабо кожна функція, оголошена за допомогою, functionстворює нову область.

Нова дочірня область успадковує всі визначення змінних від батьківської області. Призначення змінних у новій дочірній області з setкомандою буде видно лише в дочірній області, якщо не використовується PARENT_SCOPEпараметр.

Щоб зробити SOURCEFILESпризначення видимим у кореневій папці проекту, спробуйте:

set (SOURCEFILES main.cpp foo.cpp PARENT_SCOPE) 

5
Дякую, це вирішило. Але ще одне зауваження: у підкаталозі ви тепер повинні використовувати, ${CMAKE_CURRENT_SOURCE_DIR}/foo.cppа не лише foo.cppтому, що cmake тепер знаходиться у батьківській області.
blubberbernd

2
Крім того, ви можете встановити змінну в батьківському файлі CMakeLists.txt перед викликом add_subdirectory і мати її визначення успадковувати до дочірнього файлу CMakeLists. Знову ж таки, вам потрібно буде визначити імена файлів, якщо вам потрібно буде посилатися на них із декількох файлів CMakeLists.
DLRdave

8
Вам потрібно буде створити змінну також у поточному діапазоні, щоб використовувати її значення у піддиректорії / функції:set(VAR value PARENT_SCOPE); set(VAR ${VAR});
Patrick B.

9
@PatrickB. в моєму випадку set(VAR value PARENT_SCOPE); set(VAR ${VAR});не працює, однак, set(VAR value); set(VAR ${VAR} PARENT_SCOPE);працює.
Deqing

5
Крім того, ви можете отримати доступ з батьківського каталогу до певної змінної в Suddir, як це get_directory_property(VAR1 DIRECTORY subdir1 DEFINITION VAR1)
Максим Суслов
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.