包括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命令时,这似乎不是一个受支持的结构,除非我遗漏了什么。一般来说;最佳实践";为了实现我将目录结构与依赖树解耦的目标?

如果您想将项目与依赖项解耦,那么我建议将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"导入依赖项。

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

最新更新