CMake: почему add_subdirectory не виден другим подкаталогам - PullRequest
0 голосов
/ 22 сентября 2018

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

project
  - CMakeLists.txt
  - src
  - LibA
    - CMakeLists.txt
  - LibB
    - CMakeLists.txt

Корневой файл CMakeLists.txt выглядит примерно так:

add_subdirectory(LibA)
add_subdirectory(LibB)
add_executable(foo src/main.cpp)
target_link_libraries(foo LibA LibB)

Однако LibB на самом деле хочет использовать некоторые функции из LibAтакже.Однако я не могу получить доступ к LibA из LibB.Но я также не могу добавить его в качестве подкаталога.Это настоящая проблема для меня.Как мне лучше решить это?

Заранее спасибо.

1 Ответ

0 голосов
/ 22 сентября 2018

Решение немного сложное, но я хотел бы объяснить его в упрощенном виде ...

Структура проекта должна быть:

 /src
   |
   +-- /lib-a
   |     +-- /includes
   |     +-- /sources
   |     +-- LibAConfig.cmake
   |     \-- CMakeLists.txt
   +-- /lib-b
   |     +-- /includes
   |     +-- /sources
   |     +-- LibBConfig.cmake
   |     \-- CMakeLists.txt
   \-- /main
   |     +-- /includes
   |     +-- /sources
   |     \-- CMakeLists.txt
   \-- CMakeLists.txt

/src / lib-a / LibAConfig.cmake должно быть:

# Debug

MESSAGE ("-- Library A configuration...")

# Headers

include_directories(${CMAKE_CURRENT_LIST_DIR}/includes)

/ src / lib-a / CMakeLists.txt должно быть:

# Define project

project(LibA CXX)

# Debug

message("-- Working on \"${CMAKE_CURRENT_SOURCE_DIR}\"...")

# Package registration

set(LibA_DIR ${CMAKE_CURRENT_SOURCE_DIR} CACHE INTERNAL "")

# Project files

include_directories(includes)
file(GLOB _SOURCES sources/*.cpp)

# Go on with your module setup...

/ src / lib-b / LibBConfig.cmake должно быть:

# Debug

MESSAGE ("-- Library B configuration...")

# Headers

include_directories(${CMAKE_CURRENT_LIST_DIR}/includes)

/ src / lib-b / CMakeLists.txt должно быть:

# Define project

project(LibB CXX)

# Debug

message("-- Working on \"${CMAKE_CURRENT_SOURCE_DIR}\"...")

# Package registration

set(LibB_DIR ${CMAKE_CURRENT_SOURCE_DIR} CACHE INTERNAL "")

# Project files

include_directories(includes)
file(GLOB _SOURCES sources/*.cpp)

# Reference/Link to LIB-A

find_package(LibA)

# Go on with your module setup...

/ src / main / CMakeLists.txt должно быть:

# Define project

project(MainApp CXX)

# Debug

message("-- Working on \"${CMAKE_CURRENT_SOURCE_DIR}\"...")

# Project files

include_directories(includes)
file(GLOB _SOURCES sources/*.cpp)

# Reference/Link to LIB-A and LIB-B

find_package(LibA)
find_package(LibB)

# Go on with your module setup...

/ src / CMakeLists.txt должно быть:

# Define project

project(MyProject CXX)

# Debug

message("-- Working on \"${CMAKE_CURRENT_SOURCE_DIR}\"...")

add_subdirectory(lib-a)
add_subdirectory(lib-b)
add_subdirectory(main)

# Go on with your module setup...

Я взял приведенный выше пример из моего проекта ...

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