如何使用 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 抽象库,然后 运行 安装并导出它。
- 这是将库编译为 windows 上的 .lib 或 linux 上的 .a 并将其导出到已知共享位置的一般首选方式吗?
- 我猜需要将此库的所有 public header 文件复制到同一位置?如果是这样,如何最正确地做到这一点?
如果我有我的 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/ 来支持将依赖项拆分为单独的库。
澄清:如果下面的设置是一种合理的方法,那么我的问题主要是,如何最好地添加 public headers 与 .lib 当我 运行 ninja 安装 因为我的解决方案目前不这样做。
关于如何以不同方式做事的例子数不胜数,而且许多似乎相互矛盾,这让我更加困惑。
我正在尝试更改 in-house 构建系统并将其替换为 CMake。代码库由许多不同的 components/libraries 组成,例如 OS/Platform 抽象、网络、功能等。在此之前,它总是作为一个大代码库一起编译,因此 运行ning clean 将删除所有内容并重建所有内容依赖项。
现在谈到我无法理解在 CMake 中如何以现代智能方式进行操作的部分。
忽略需要顶部的 dependency-chain 工具这一事实,我的想法是按库的顺序构建 components/libraries,不依赖于最顶层的独立构建 运行秒。 然后每个独立的构建 运行 将与其依赖项一起构建,就像 windows API 用于 OS 抽象库,然后 运行 安装并导出它。
- 这是将库编译为 windows 上的 .lib 或 linux 上的 .a 并将其导出到已知共享位置的一般首选方式吗?
- 我猜需要将此库的所有 public header 文件复制到同一位置?如果是这样,如何最正确地做到这一点?
如果我有我的 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/ 来支持将依赖项拆分为单独的库。