解决正交模块的依赖性

时间:2020-06-04 18:33:32

标签: c++ cmake

我有一个由几个模块组成的项目,我想使用CMake的<meta name="viewport" content="width=device-width, initial-scale=1.0">函数:

add_subdirectory

这些顶级模块彼此独立,但是它们都依赖于日志记录模块。 当我将相关的顶层模块代码从根Project + CMakeLists.txt + bin + (stuff that depends on lib/) + lib module1 + CMakeLists.txt + (cpp,hpp) module2 + CMakeLists.txt + (cpp,hpp) module3 + CMakeLists.txt + (cpp,hpp) logging.cpp logging.hpp 移到特定的子目录时,由于缺少日志记录模块,因此无法使用CMakeLists进行编译。

是否可以将对日志记录模块的依赖关系编程到顶级模块的make中,还是在根目录中调用CMakeLists时会自动解决?

1 个答案:

答案 0 :(得分:2)

有没有一种方法可以将对日志记录模块的依赖性编程到顶级模块的CMakeList中...

是的,您可以在根CMakeLists.txt文件中为记录功能定义CMake库目标。

CMakeLists.txt

cmake_minimum_required(VERSION 3.16)

project(MyBigProject)

# Tell CMake to build a shared library for the 'logging' functionality.
add_library(LoggingLib SHARED
    lib/logging.cpp
)
target_include_directories(LoggingLib PUBLIC ${CMAKE_SOURCE_DIR}/lib)

# Call add_subdirectory after defining the LoggingLib target.
add_subdirectory(lib/module1)
add_subdirectory(lib/module2)
add_subdirectory(lib/module3)

...

然后,只需将日志库目标链接到需要它的其他模块目标。例如:

lib/module1/CMakeLists.txt

project(MyModule1)

# Tell CMake to build a shared library for the 'Module1' functionality.
add_library(Module1Lib SHARED
    ...
)

# Link the LoggingLib target to your Module1 library target.
target_link_libraries(Module1Lib PRIVATE LoggingLib)

注意,这假设您从项目的 root 运行CMake。例如,如果直接在lib/module1/CMakeLists.txt文件上运行CMake,则它没有有权访问在根CMakeLists.txt文件中定义的日志记录目标。