#c #cmake #c 17
#c #cmake #c 17
Вопрос:
Я хочу создать два проекта с использованием cmake (библиотека и изолированное приложение, использующие эту библиотеку).
В настоящее время у меня следующая структура папок:
-- yanthra_engine
|
-- CMakeLists.txt
-- lib
-- ...
-- sandbox
|
-- CMakeLists.txt
-- out
-- ...
yantra_engine создает библиотеку, в которой as sandbox создает исполняемый файл (используя вышеупомянутую библиотеку).
Должен ли я хранить полноценные файлы CMakeLists для обоих проектов? Есть ли какая-либо эффективная структура папок, которой нужно следовать?
Я бы хотел, чтобы библиотека создавалась автоматически при создании моего приложения в изолированной среде, но не наоборот.
Ответ №1:
Вы должны хранить отдельные CMakeLists.txt
файлы. Рекомендуется использовать один CMakeLists.txt
файл для каждой несвязанной цели. (Не связанные в том смысле, что они не являются разными сборками одной и той же библиотеки, например, одна общая статическая.)
Добавлять ли обе цели в один и тот же проект, в основном зависит от вас. Если библиотека настроена правильно, вы можете создать отдельный проект для библиотеки и использовать его цель установки для установки библиотеки, включая файлы конфигурации cmake, на свой компьютер, что упрощает импорт установленной библиотеки в качестве цели в проект изолированной среды. Для этого необходимо добавить соответствующие install
команды в библиотеку.
Если вы хотите иметь возможность создавать как библиотеку, так и изолированную среду с помощью одних и тех же файлов сборки, в основном все, что вам нужно сделать, это убедиться, что оба CMakeLists.txt
файла доступны из CMakeLists.txt
файла.
Без указания местоположения какого-либо из файлов вы могли бы, например
- Создайте
CMakeLists.txt
файл в родительской папке, добавив оба подкаталога
cmake_minimum_required(VERSION 3.0)
project(CommonProject)
add_subdirectory(yanthra_engine)
add_subdirectory(sandbox EXCLUDE_FROM_ALL) # targets in sandbox not built by default.
- Вы также можете включить
yanthra_engine
каталог изsandbox/CMakeLists.txt
...
add_subdirectory(../yanthra_engine "${CMAKE_BINARY_DIR}/yanthra_engine_build")
...
Оба подхода позволяют либо настроить проект сборки для библиотеки самостоятельно, либо настроить проект сборки для обоих. В подходе 1 исходным каталогом для построения обоих будет родительский каталог yanthra_engine
and sandbox
, а в подходе 2 это будет sandbox
.
Для обоих подходов вам не нужно беспокоиться о ненужном создании проекта в изолированной среде, если вы укажете цель, которую хотите создать. Поскольку изолированная среда связывает библиотеку, но не установлена зависимость, наоборот, создание изолированной среды гарантирует, что библиотека обновлена, но создание библиотеки создает только библиотеку и ее зависимости, что исключает изолированную среду.
Комментарии:
1. Спасибо за этот аккуратный описательный ответ.
Ответ №2:
Одна вещь, которую вы можете попробовать, это позволить yanthra
быть подкаталогом sandbox
. Затем вы можете сделать это в sandbox
:
add_subdirectory(yanthra_engine)
Комментарии:
1. обязательно попробую это сделать. Спасибо за ответ.