Cmake создает два проекта

#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 файла.

Без указания местоположения какого-либо из файлов вы могли бы, например

  1. Создайте 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.
  
  1. Вы также можете включить 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. обязательно попробую это сделать. Спасибо за ответ.