Проект cmake создает только один конкретный исполняемый файл (и его зависимости)

У меня есть проект CMake с примерно такой структурой:

.
|-- library1
|   |-- CMakeLists.txt
|-- library2
|   |-- CMakeLists.txt
|-- executables
|   |-- CMakeLists.txt

в executables я генерирую свои 2 исполняемых файла. Интересно, можно ли было просто сгенерировать один исполняемый файл и его зависимости вместо всех. Я слышал что-то о Cmake --target вариант, но я не могу заставить его работать с cmake/3.13.4,

1 ответ

Решение

Здесь есть пара потенциальных проблем. Во-первых, типичный рабочий процесс CMake помещает build папка, как брат к файлу CMake верхнего уровня. Итак, ваша файловая иерархия должна выглядеть примерно так:

.
|-- CMakeLists.txt
|-- library1
|   |-- CMakeLists.txt
|-- library2
|   |-- CMakeLists.txt
|-- executables
|   |-- CMakeLists.txt
|-- build    <------------ Run CMake commands from here.

Это изолирует все сгенерированные CMake файлы в build папка. Во-вторых, вы должны осторожно запускать этапы сборки CMake в нужном месте. Мы можем запустить все изнутри build папка, например:

  1. Чтобы сгенерировать систему сборки, запустите cmake .. из build каталог. Этот первый шаг должен указывать на файл CMake верхнего уровня.

  2. Чтобы построить (или скомпилировать) конкретную цель, скажем, она называется MyExecutable1, бегать cmake --build . --target MyExecutable1 из build каталог. Вы должны обязательно указать --build флаг на build папка, а не файл CMake верхнего уровня на этот раз. Кроме того, имя цели, которое нужно указать в этой команде, должно соответствовать имени цели, используемому в add_executable(), а не название проекта или что-то еще.

  3. Как всегда, при получении ошибок / проблем при попытке запустить CMake, это помогает очистить кеш (удалить build/CMakeCache.txt) или просто удалите build Папка в целом и начать все заново.

Другие вопросы по тегам