计算机
c base
c++ 基础 作用域及生命周期
c++ template
c++ 内存视角
c++ 函数指针
c++ 基础 基础语法
c++ 多线程
c++ 性能
c++ 类 基础
c++ 类 对象模型 类析构
c++ 类 设计模式
cmake
CMAKE环境搭建 windows
创建第一个cmakelists.txt
构建稍复杂的项目
动态链接库
EX1
EX1 START
EX1 ANSWER
EX2
EX2 START
EX2 ANSWER
EX3
EX3 START
EX3 ANSWER
变量
控制流程
函数和宏
查找和使用外部库
生成器表达式
qt 开发环境
qt c++
理解QObject 1
理解QObject 4
qt index
qt qml quick
qt ui
qt 多线程
数据结构 数组
PC问题监控及排查
PC程序性能优化
OS
TOOL
C++ STL
编程漫谈
C++实战-生产者 消费者流水线
C++实战 IO
本站点使用 MrDoc 构建
-
+
查找和使用外部库
#### 两种导入方法 现代 CMake 推荐使用导入目标,而不是变量。 ##### 传统方式(不推荐) ```cmake find_package(ZLIB REQUIRED) add_executable(myapp main.cpp) # 手动设置包含目录和链接库 target_include_directories(myapp PRIVATE ${ZLIB_INCLUDE_DIRS}) target_link_libraries(myapp ${ZLIB_LIBRARIES}) ``` ##### 现代方式(推荐) ```cmake find_package(ZLIB REQUIRED) add_executable(myapp main.cpp) # 使用导入目标,自动处理包含目录和链接 target_link_libraries(myapp ZLIB::ZLIB) ``` #### 查找外部库 ```cmake cmake_minimum_required(VERSION 3.15) project(MyApp) # 指定查找路径 list(APPEND CMAKE_PREFIX_PATH "/usr/local") list(APPEND CMAKE_PREFIX_PATH "$ENV{HOME}/local") # 设置包特定路径 set(Boost_ROOT "/opt/boost") find_package(Boost REQUIRED) # 或使用环境变量 # export Boost_ROOT=/opt/boost # 设置模块路径 # 添加自定义 Find 模块路径 list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake") # 查找 Threads 库(跨平台线程支持) find_package(Threads REQUIRED) add_executable(myapp main.cpp) # 链接找到的库 # 使用导入目标,自动处理包含目录和链接 target_link_libraries(myapp Threads::Threads) ``` #### 两种查找模式 ##### 1. Module 模式(Find 模块) CMake 查找名为 `FindPackageName.cmake` 的模块文件。 **查找路径:** 1. `CMAKE_MODULE_PATH` 中的目录 2. CMake 内置模块目录 **示例:** ```cmake # 查找 ZLIB(CMake 内置 FindZLIB.cmake) find_package(ZLIB REQUIRED) if(ZLIB_FOUND) message("ZLIB version: ${ZLIB_VERSION}") message("ZLIB include: ${ZLIB_INCLUDE_DIRS}") message("ZLIB libraries: ${ZLIB_LIBRARIES}") endif() add_executable(myapp main.cpp) target_link_libraries(myapp ZLIB::ZLIB) ``` ##### 2. Config 模式(包配置文件) CMake 查找包提供的配置文件 `PackageNameConfig.cmake` 或 `packagename-config.cmake`。 **查找路径:** - `<PackageName>_DIR` - `CMAKE_PREFIX_PATH` - 系统标准路径 **示例:** ```cmake # 查找 fmt 库(现代 C++ 格式化库) find_package(fmt REQUIRED) add_executable(myapp main.cpp) target_link_libraries(myapp fmt::fmt) #版本要求,要求 Boost 1.70 或更高 find_package(Boost 1.70 REQUIRED) ``` #### 创建 IMPORTED 目标 mylib::mylib是.cmake定义的接口 ```mylib-config.cmake add_library(mylib::mylib SHARED IMPORTED) set_target_properties(mylib::mylib PROPERTIES # 头文件路径 - 使用者会自动获得 INTERFACE_INCLUDE_DIRECTORIES "C:/mylib/include" # DLL 文件位置 IMPORTED_LOCATION "C:/mylib/bin/mylib.dll" # LIB 文件(Windows导入库) IMPORTED_IMPLIB "C:/mylib/lib/mylib.lib" # 需要的其他依赖 INTERFACE_LINK_LIBRARIES "ZLIB::ZLIB" ) ``` ``` CMakeLists.txt # 使用者只需要这样写 find_package(mylib REQUIRED) add_executable(myapp main.cpp) # 就这一行!自动获得: # 1. 头文件路径 (C:/mylib/include) # 2. 链接 mylib.dll # 3. 自动链接 ZLIB target_link_libraries(myapp mylib::mylib) ```
peipeo
2026年5月16日 15:35
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
Markdown文件
PDF文档(打印)
分享
链接
类型
密码
更新密码