【问题标题】:Including CMake Project Libraries包括 CMake 项目库
【发布时间】:2020-11-09 00:13:49
【问题描述】:

我正在第一次使用 CMake 组合一个小型 c++ 项目。我目前的项目结构是

├── bch
│   ├── CMakeLists.txt
│   ├── gf
│   │   ├── CMakeLists.txt
│   │   ├── include
│   │   │   └── gf.h
│   │   └── src
│   │       └── gf.cpp
│   ├── include
│   │   └── bch.h
│   └── src
│       └── bch.cpp
├── bsc
│   ├── CMakeLists.txt
│   ├── include
│   │   └── bsc.h
│   └── src
│       └── bsc.cpp
├── CMakeLists.txt
├── .gitignore
└── main.cpp

目前我将gf 作为bch 的子目录。 bch/CMakeLists的内容是

cmake_minimum_required(VERSION 3.17)
project(bch VERSION 0.1.0)

# Targets
add_library(bch STATIC src/bch.cpp)

# Dependant
add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/gf)
target_link_libraries(bch PUBLIC gf)

# Export to dependants
target_include_directories(bch PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include)

我想将gf CMake 项目放在bch 的目录路径之外。使用 add_subdirectory 命令时,这似乎不是受支持的结构,除非我遗漏了什么。一般来说,目前实现我将目录结构与依赖关系树解耦的目标的“最佳实践”是什么?

【问题讨论】:

  • "我想将gf CMake 项目放在bch 的目录路径之外。使用add_subdirectory 命令时,这似乎不是受支持的结构" - 为什么你认为它不被支持?如果您收到错误add_subdirectory not given a binary directory,请参阅that question 以及有关解决方法的答案。
  • 这是我选择的当前配置,直到我可以将gf 库打包到一个模块中。我将bch/build 目录用于gf 二进制文件,这似乎可以工作。我正在阅读的各种博客文章似乎暗示 add_subdirectory 建议用于树内紧密耦合的项目。

标签: c++ cmake


【解决方案1】:

如果您想将项目与依赖项解耦,那么我建议将 cmake 项目分成两个独立的项目,导出依赖目标,然后使用“find_package”导入它。这是该主题的快速谷歌查找: https://visualgdb.com/tutorials/linux/cmake/find_package

[编辑]

对于更通用的方法,我建议使用 cmake 文档:

https://cmake.org/cmake/help/latest/command/find_package.html#command:find_package

https://cmake.org/cmake/help/latest/module/CMakePackageConfigHelpers.html

https://cmake.org/cmake/help/v3.18/command/install.html#export

想法是:

  1. 在要生成“*ConfigVersion.cmake”文件的依赖项目中,使用“install”命令参数中的“EXPORT”安装所有需要的文件(头文件、二进制文件和*ConfigVersion.cmake)。

  2. 在最终项目中使用“find_package”来导入依赖项。

对于较大的库项目,我还建议使用命名空间来允许仅导入库的选定部分。

【讨论】:

  • 感谢您的链接,尽管演练与 VS 环境紧密耦合。我在 find_package() 功能中看到的问题是干净地打包项目所需的所有额外内容。即使增加了复杂性,它也可能最终成为要走的路。我在寻找一些答案时找到了this
  • 我已经用更一般的描述更新了答案。希望对你有帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多