如何使用 CMake 为其他项目 'install' 和使用 in-house 依赖项

How to 'install' and use in-house dependencies for other projects with CMake

澄清:如果下面的设置是一种合理的方法,那么我的问题主要是,如何最好地添加 public headers 与 .lib 当我 运行 ninja 安装 因为我的解决方案目前不这样做。

关于如何以不同方式做事的例子数不胜数,而且许多似乎相互矛盾,这让我更加困惑。

我正在尝试更改 in-house 构建系统并将其替换为 CMake。代码库由许多不同的 components/libraries 组成,例如 OS/Platform 抽象、网络、功能等。在此之前,它总是作为一个大代码库一起编译,因此 运行ning clean 将删除所有内容并重建所有内容依赖项。

现在谈到我无法理解在 CMake 中如何以现代智能方式进行操作的部分。

忽略需要顶部的 dependency-chain 工具这一事实,我的想法是按库的顺序构建 components/libraries,不依赖于最顶层的独立构建 运行秒。 然后每个独立的构建 运行 将与其依赖项一起构建,就像 windows API 用于 OS 抽象库,然后 运行 安装并导出它。

如果我有我的 OS 抽象文件夹结构

OSabstraction/
  includes/
    OSabstraction/
        abstraction.h
  src/
    abstraction.cpp
  CMakeLists.txt

我的 CMakeLists 是

cmake_minimum_required(VERSION 3.12)
project(OSabstraction LANGUAGES CXX)

add_library(abstraction)

target_sources(abstraction
    PRIVATE
        src/abstraction.cpp
)
target_include_directories(abstraction
    PUBLIC
    $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/includes/>
    $<INSTALL_INTERFACE:include>
)

install(
    TARGETS abstraction
    EXPORT abstraction-export
    ARCHIVE DESTINATION lib
)

我如何最好地在许多其他内部项目中使用这个库?这个库实际上要大很多倍,那么对于一个大项目来说,正确的方法是什么?

编辑:我试图遵循 Pablo Arias' guide on how to do CMake Right,但我不确定 build_interface 和 install_interface 生成器在获取我的 header 文件方面如何工作导出 .lib 文件。

推荐的解决方案是将包管理器与 CMake 一起使用。 下面的 link 是一个完整的 C++ 项目设置模板,它可以使用包管理器 https://conan.io/ 来支持将依赖项拆分为单独的库。

https://github.com/trondhe/cmake_template