CMake:为什么added_subdirectory对其他子目录不可见

CMake: Why is an added_subdirectory not visible to other subdirectories

本文关键字:子目录 其他 subdirectory 为什么 added CMake      更新时间:2023-10-16

我有以下项目结构:

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 中的一些功能。但是,我无法从 LibB 内部访问 LibA。但我也不能将其添加为子目录。这对我来说是一个真正的问题。我怎样才能最好地解决它?

提前谢谢。

解决方案有点复杂,但我希望以简化的方式解释它......

项目结构应为:

/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...

我从我的一个项目中获得了上面的例子......

相关文章: