Структура проекта C ++ cmake с модульными библиотеками - PullRequest
0 голосов
/ 30 ноября 2018

Я много искал, но не могу найти хорошую и непротиворечивую информацию о том, как сделать проект CMAKE C ++ высоко модульным.

Информация о проекте:

  • C ++ CMAKE проект, который создает исполняемый файл (не библиотеку).
  • Я хочу, чтобы различные части проекта были библиотеками, чтобы они могли потенциально использоваться другими проектами.
  • Допустим, этот проект зависит от 3 библиотек.Давайте назовем их TheLib , SubLib1 , SubLib2 .Я хочу, чтобы SubLib1 и SubLib2 были независимыми, а это означает, что кто-то может использовать их в одиночку.Но TheLib зависит от двух суб-библиотек.Также я должен отметить, что эти 3 библиотеки разработаны мной, но я хочу позволить любому (или будущему мне) просто выбрать любой из этих 3 и включить их в другой проект.
  • Я хочу эти 3 библиотекибыть включенным в проект, а не ожидаемым, чтобы быть найденным где-то еще.
  • Проект также зависит от сторонней библиотеки, назовем ее ExtLib ,Я также хочу, чтобы эта библиотека была включена в проект и не должна была быть найдена где-то еще.
  • Различные библиотеки должны иметь свои собственные CMakeLists.txt

ЧтоЯ хочу сделать:

Найти структуру проекта, которая связывает архитектуру проекта.

Как бы это выглядело, если бы мне пришлось угадывать:

project_root/
-CMakeLists.txt (the main cmake file)
-thirdparty/
---ExtLib/ (contains include/, src/, CMakeLists.txt)
-src/
---Main.cpp
---depends/
-----TheLib/
-------CMakeLists.txt (cmake file for TheLib)
-------include/
---------TheLib/
-----------TheLib.h
-------src/
---------TheLib.cpp
---------depends/
-----------SubLib1/ (contains include/, src/, CMakeLists.txt)
-----------SubLib2/ (contains include/, src/, CMakeLists.txt)

Вопросы: (Я знаю, что их много, любая помощь по любому из них будет признательна)

  • Что вы думаете овся структура?
  • Должен ли код для библиотек находиться вне корневого каталога src?
  • Я видел несколько проектов, в которых CMakeLists.txt находится внутри src (а не в программе/ корень библиотеки).Есть ли разница?
  • Я видел несколько проектов, которые имеют очень простые файлы CMakeLists.txt для библиотек.Это так и должно быть?Допустим, SubLib1 зависит от ReallyExtLib, которая должна быть не включена в код и находиться в / opt / local / include или что-то подобное).Должен ли CMakeLists.txt из SubLib1 иметь find_package (ReallyExtLib) и т. Д.?(Я предполагаю, что нет и просто включаю его в корневой файл проекта CMakeLists.txt)
  • За исключением зависимости от третьей стороны, есть ли у вас примеры того, как должен выглядеть файл CMakeLists.txt для проекта TheLib, SubLibX?Я нашел эту ссылку , но, похоже, речь идет о создании библиотеки, а не исполняемого файла.

Спасибо.

...