CMake 接入第三方库的三种方式:add_subdirectory、FetchContent 与 find_package(C++ 工程入门第六课)

📅 发布时间:2026/7/13 0:02:05 👁️ 浏览次数:
CMake 接入第三方库的三种方式:add_subdirectory、FetchContent 与 find_package(C++ 工程入门第六课)
本系列为《CMake 工程化进阶》完整 8 篇体系。本篇目标掌握 CMake 中接入第三方库的三种常见方式。在真实 C 工程中我们几乎不可能只写自己的代码。常见情况包括日志库spdlog格式化库fmtJSON 解析nlohmann/json网络库boost / asio问题来了如何把这些库接入到 CMake 工程CMake 提供了三种主流方式方式使用场景add_subdirectory项目内嵌源码FetchContent自动下载依赖find_package使用系统安装库这一课我们逐一讲清。一、方式一add_subdirectory源码方式这种方式最简单。适合第三方库源码直接放在项目中。示例工程结构MyApp/ app/ main.cpp util/ util.cpp util.h third_party/ fmt/ CMakeLists.txt引入第三方库add_subdirectory(third_party/fmt)这会编译 fmt生成 target链接库target_link_libraries(app fmt::fmt)现在 app 就可以使用 fmt。使用 fmt#include fmt/core.h int main() { fmt::print(Hello {}\n, CMake); }二、方式二FetchContent现代主流现代 CMake 更推荐这种方式。优点自动下载自动编译不需要手动管理源码引入模块include(FetchContent)下载库FetchContent_Declare( fmt GIT_REPOSITORY https://github.com/fmtlib/fmt.git GIT_TAG 10.1.1 )自动构建FetchContent_MakeAvailable(fmt)链接库target_link_libraries(app fmt::fmt)优点FetchContent 解决了很多问题不需要手动下载源码CMake 自动管理依赖适合开源项目三、方式三find_package系统库这种方式适合已经安装到系统中的库。例如OpenCVBoostQt示例find_package(OpenCV REQUIRED)链接库target_link_libraries(app ${OpenCV_LIBS})示例代码#include opencv2/opencv.hpp int main() { cv::Mat image; }四、三种方式对比方式优点缺点add_subdirectory简单直接需要手动管理源码FetchContent自动下载依赖网络find_package使用系统库依赖系统环境五、现代 C 项目的推荐方式如果是开源项目推荐FetchContent原因自动化可复现依赖清晰如果是公司内部项目推荐add_subdirectory因为源码可控构建稳定六、完整示例 CMakeListscmake_minimum_required(VERSION 3.15) project(MyApp) set(CMAKE_CXX_STANDARD 17) include(FetchContent) FetchContent_Declare( fmt GIT_REPOSITORY https://github.com/fmtlib/fmt.git GIT_TAG 10.1.1 ) FetchContent_MakeAvailable(fmt) add_executable(app app/main.cpp ) target_link_libraries(app fmt::fmt)七、本课总结本课解决了真实工程中最重要的问题之一如何接入第三方库。掌握三种方式方法使用场景add_subdirectory本地源码FetchContent自动下载find_package系统安装库其中FetchContent 是现代 CMake 最常见方案。下一课预告下一篇将进入Linux 服务项目的工程结构设计我们会把当前工程升级为cmd/internal/lib/third_party/并搭建一个真正可扩展的 C 服务项目骨架。