Я новичок в CMake. Я пытаюсь создать список исходных файлов C ++ и создать исполняемый файл с использованием этих исходных файлов. Чтобы избежать прохождения списка по одному уровню за раз, я использую переменную окружения. Однако не все перечисленные источники добавляются в env var, только первый.
Вот что у меня есть:
Структура каталогов:
<root>
├─ build
│ ├─ <snip>
├─ src
│ ├─ something
│ │ ├─ CMakeLists.txt
│ │ ├─ a.cpp
│ │ ├─ a.h
│ │ ├─ b.cpp
│ │ └─ b.h
│ ├─ CMakeLists.txt
│ └─ main.cpp
├─ CMakeLists.txt
root / CMakeLists.txt:
cmake_minimum_required(VERSION 3.10.0 FATAL_ERROR)
project(samplecpp VERSION "0.1.0" LANGUAGES CXX)
# ---- SOURCES ----
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/src)
set(ENV{MY_SOURCES} "")
add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/src)
message(STATUS "MY_SOURCES = " $ENV{MY_SOURCES})
# ---- EXECUTABLE ----
add_executable(samplecpp ${CMAKE_CURRENT_SOURCE_DIR}/src/main.cpp $ENV{MY_SOURCES})
root / src / CMakeLists.txt:
add_subdirectory(something)
root / src / что-то / CMakeLists.txt:
set(
ENV{MY_SOURCES}
$ENV{MY_SOURCES}
${CMAKE_CURRENT_SOURCE_DIR}/a.cpp
${CMAKE_CURRENT_SOURCE_DIR}/b.cpp
)
Выполняется cmake должен напечатать сообщение MY_SOURCES = root/src/something/a.cpproot/src/something/b.cpp
, но я получу только MY_SOURCES = root/src/something/a.cpp
. Из-за этого cmake --build
завершается с ошибкой:
<root>/src/main.cpp:11: undefined reference to `B::do_b()'
Что я делаю не так?
На всякий случай вот пример на github