首页 > 解决方案 > 包括 CMake 项目库

问题描述

我正在第一次使用 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)

我想将gfCMake 项目放在bch. add_subdirectory除非我遗漏了什么,否则在使用该命令时这似乎不是受支持的结构。一般来说,实现我将目录结构与依赖树分离的目标的当前“最佳实践”是什么?

标签: c++cmake

解决方案


如果您想将项目与依赖项分离,那么我建议将 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”来导入依赖项。

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


推荐阅读