CMakeLists с несколькими CMakeLists под ним в дереве сборки - PullRequest
0 голосов
/ 14 января 2020

У меня есть следующее дерево:

/all-targets
----CMakeLists.txt
----/target1
--------CMakeLists.txt
--------/include
--------/src
----/target2
--------CMakeLists.txt
--------/include
--------/src
----/target3
--------CMakeLists.txt
--------/include
--------/src

CMake верхнего уровня должен иметь возможность связывать все цели вместе без создания какого-либо исполняемого файла или файла библиотеки, только генерируя любой тип проекта с правильной структурой / tree

target1 должен иметь библиотеку / объектный файл из target2, чтобы его можно было скомпилировать.

Я прочитал их: 1. Несколько CMakeLists 2. CMake - в зависимости от другого проекта cmake

Теперь я понимаю, что в CMakeLists.txt верхнего уровня я могу добавить команду add-subdirectory, чтобы добавить target1, target2 и target3 (дочерние каталоги). ) но я все еще не понимаю, что я должен добавить в /target1/CmakeLists.txt, чтобы он мог быть связан с файлом библиотеки target2? Я не думаю, что это add-subdirectory, потому что в этом случае каталог target2 не является дочерним / вложенным каталогом.

Может ли файл CmakeLists.txt верхнего уровня понять, что я хочу только создать ссылку на файл проекта цели вместе без вывода (исполняемый файл - библиотека).

1 Ответ

2 голосов
/ 14 января 2020

Вы не дали нам много на go, но я могу дать общую идею.

CMakeLists верхнего уровня просто вызывает add_subdirectory для различных целей. Они должны быть отсортированы так, чтобы ни одна цель не зависела от целей после it.

Для target1 у вас может быть следующее:

add_library(target1_common STATIC oven.cpp pan.cpp tray.cpp)
target_include_directories(target1_common PUBLIC include)
add_executable(target1 target1_main.cpp)
target_link_libraries(target1 PRIVATE target1_common)

Вы сказали, что target2 зависит от некоторых части target1, поэтому:

add_library(target2_common STATIC table.cpp chair.cpp plate.cpp)
target_include_directories(target2_common PUBLIC include)
target_link_libraries(target2_common PUBLIC target1_common)

add_executable(target2 target2_main.cpp)
target_link_libaries(target2 PRIVATE target2_common)

Исполняемые файлы связаны PRIVATE, поскольку вы не будете ссылаться на них в дальнейшем, но PUBLIC также будет работать.

РЕДАКТИРОВАТЬ: Добавлено target_include_directories операторов, которые автоматически заполняют путь поиска заголовка для target1_common и target2_common

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...