Проект Cmake с несколькими исполняемыми файлами

#c #cmake #clion

#c #cmake #clion

Вопрос:

У меня возникли проблемы с организацией моего проекта с использованием CMake с несколькими исполняемыми файлами. У меня следующая структура:

 CmakeLists.txt
main.cpp
somelib.cpp
somelib.h
dir1
  main.cpp
  file1.h
  file1.cpp
  ...
dir2
  main.cpp
  lib1.h
  lib2.cpp
  ...
  

В общем, я хочу иметь возможность выбирать исполняемый файл в Clion и запускать любой проект независимо, включая внешний, который зависит от двух других проектов. Во внешнем main.cpp я включаю заголовки из dir1 и dir2. Сами проекты dir1, dir2 зависят от разных библиотек Boost , таких как Eigen , и т.д. Qt Каков наилучший способ заставить эту структуру работать? Я новичок в Cmake, и многократные попытки использования add_subdirectory не приблизили меня к решению. Я заставил его работать только в том случае, когда у меня есть внешний CmakeLists.txt и включите туда все библиотеки, используя dir1, dir2 просто как папки без каких-либо CmakeLists.txt внутри. Я был бы признателен за любую помощь.

Комментарии:

1. Я думаю, ваша проблема в основном в том, как это сделать с помощью CLion. В Visual Studio я использую метод, аналогичный описанному вами, но в IDE я выбираю, какой проект я хочу отладить / запустить. Он показывает все проекты в одной рабочей области. Однако у меня есть CMakeLists.txt для каждого исполняемого файла и каждой библиотеки в моем проекте и CMakeLists.txt на корневом уровне.

2. Меня больше всего интересует, как написать соответствующий CmakeLists.txt потому что у меня есть ошибки во время настройки и сборки. Не могли бы вы описать, как каждый отдельный CmakeLists.txt как выглядит?

Ответ №1:

С точки зрения простого CMake — так что я понятия не имею, как это взаимодействует с CLion, но вы указываете в комментариях, что запись — CMakeLists.txt это важные биты — один из способов сделать это так:

  • иметь CMakeLists.txt который устанавливает параметры CMake, стандарты C , флаги компилятора, параметры и т.д.
  • после всех настроек add_subdirectory(dir1/) и add_subdirectory(dir2/)
  • после этого, все, что вам нужно для цели верхнего уровня, например add_executable(mytoplevelprogram main.cpp somelib.cpp) . Если для сборки mytoplevelprogram требуются заголовки из библиотек, используйте подходящие target_include_directories(mytoplevelprogram ...) и / или ссылки на артефакты, созданные в подкаталогах
  • в каждом из подкаталогов dir1 и dir2 напишите a CMakeLists.txt , который находит зависимости и создает исполняемый файл для этого подкаталога с подходящими add_executable() командами.

Обычно нет причин помещать более одной project() команды в ваше дерево исходных текстов.

Комментарии:

1. Вы имеете в виду, что мне не нужно иметь project() команду в верхней части каждого CmakeLists.txt ?