Связать один проект с другим CMAKE - PullRequest
1 голос
/ 12 июня 2019

Я строю проект, который содержит множество подпроектов. например как ...

LibA (build as shared library)

LibB (depends on LibA & build as shared library)

AppB (depends on LinB)

Структура каталогов (которую я хочу) выглядит как ...

bin/
output/
src/libA/
src/libB/
src/appB/

Каждый из подпроектов (LibA, LibB и AppB) имеет свой собственный файл CMakeLists.txt.

Я хочу ..

1. Build LibA as shared library (I know how to do it)

2. Build LibB as shared library with linking of LibA (Don't Know how to do)
   Explanation: When I start building LibB, 
                LibA build first and 
                ready to link for LibB 
                when LibB ready to finish

3. Build AppB : If I start building AppB, 
                LibA build first and 
                LibB build after and
                both linked to AppB

Теперь я знаю классический способ, собираю отдельно LibA & LibB и предоставляемый путь к lib и включаю в AppB. Но я хочу построить их сразу как

  Build LibA 
  Build LibB (if LibA is already build then ignore, else build LibA)
  Build AppB (if LibA, LibB are already build then ignore, else build them)

Что я хочу

  • Как мне добиться такого поведения с помощью CMAKE?
  • Должно быть кроссплатформенным
  • Достаточно просто, чтобы включить еще много подпроектов

1 Ответ

1 голос
/ 12 июня 2019

Вот одно из решений.Вы можете использовать файл верхнего уровня CMakeLists.txt, чтобы связать все проекты вместе.Таким образом, в вашей структуре каталогов это было бы размещено здесь:

bin/
output/
src/libA/
src/libB/
src/appB/
CMakeLists.txt    <--- Top-level CMakeLists.txt

Ваш файл CMakeLists.txt верхнего уровня (как родственный элемент для каталога src) может выглядеть следующим образом:

cmake_minimum_required(VERSION 3.11)

# Add your dependencies in the order you want them to build.
add_subdirectory(src/libA)
add_subdirectory(src/libB)
add_subdirectory(src/appB)

Поскольку каждый из каталогов src имеет свой собственный файл CMakeLists.txt, вот пример каждого из них в отдельности.

Вы можете настроить LibA как общую библиотеку с CMake с помощью CMakeLists.txt файл в src/libA:

project(LibA_Project)
add_library(LibA SHARED sourceA.cpp  ... more sources here ...)

Затем CMake перейдет в каталог src/libB для настройки LibB.Вот как может выглядеть файл src/libB/CMakeLists.txt:

project(LibB_Project)
# Create a shared library for LibB as well.
add_library(LibB SHARED sourceB.cpp  ... more sources here ...)

# Link LibA to LibB as a dependency.
target_link_libraries(LibB LibA)

Наконец, CMake перейдет в каталог src/appB.Вот этот файл CMakeLists.txt:

project(AppB_Project)
# Create the executable AppB.
add_executable(AppB main.cpp ... more sources here ...)

# Link LibA and LibB to AppB as dependencies.
target_link_libraries(AppB LibA LibB)

Этот подход можно легко расширить, включив в него больше подпроектов (например, LibC, LibD, AppE и т. Д.), Если необходимо.

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