#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 ?