cmake使用find_package调用库

这篇博客介绍了如何在CMake项目中查找并引入yaml-cpp库。首先通过find命令搜索库文件,然后在cmakelists.txt中使用find_package指令,并添加include目录和链接库,确保能在cpp文件中顺利使用yaml头文件。

以添加yaml库为例:
yaml库的名字叫 “yaml-cpp”
搜索yaml:

$ find / -name "*yaml*"

可以找到yaml-cpp的 *-config.cmake文件如下:
/usr/lib/aarch64-linux-gnu/cmake/yaml-cpp/yaml-cpp-config.cmake

打开yaml-cpp-config.cmake

vim /usr/lib/aarch64-linux-gnu/cmake/yaml-cpp/yaml-cpp-config.cmake

可以看到我们常需要用到的几个名字的定义 YAML_CPP_INCLUDE_DIR 和 YAML_CPP_LIBRARIES
在这里插入图片描述

在需要引入yaml-cpp的工程的cmakelists.txt里:

find_package(yaml-cpp REQUIRED)
if (NOT yaml-cpp_FOUND)
    message(FATAL_ERROR "Not found yaml-cpp, you should install yaml-cpp")
endif ()
include_directories(${YAML_CPP_INCLUDE_DIR})

target_link_libraries(highway_perception_node ${YAML_CPP_LIBRARIES})

完成上面的内容,就可以在cpp文件里include yaml的头文件进行使用了

<think>嗯,用户想了解如何创建.cmake文件,以便让CMakefind_package能够使用。我需要根据之前的回答和相关引用内容来组织这个回答。首先,用户提到引用了四个资料,其中引用[3]详细说明了如何配置自己的CMake模块,而引用[4]则是一个错误示例,说明缺少FindQt6.cmake文件,这可能涉及到如何正确设置路径的问题。 首先,我应该从基本步骤开始,解释创建自定义CMake模块的整体流程。根据引用[3],关键步骤包括创建Config和Version文件,使用configure_file生成配置,并正确安装这些文件。然后,用户可能需要设置CMAKE_MODULE_PATH或者CMAKE_PREFIX_PATH,让CMake找到这些模块。 接下来,我需要分步骤详细说明每个部分。例如,第一步是创建项目结构,包括头文件、源文件和CMakeLists.txt。然后,如何生成并安装Config和Version文件,这部分引用[3]提到configure_file的作用,需要解释清楚。同时,用户可能需要了解如何编写Version文件来检查版本兼容性。 另外,引用[2]提到CMAKE_MODULE_PATH的作用,用户可能需要知道如何设置这个变量,或者使用CMAKE_PREFIX_PATH来指定安装路径。例如,安装到标准目录或在其他项目中引用时如何配置路径。 还要注意,用户之前的回答中提到了混合依赖管理模板,这可能涉及到如何让系统优先,或者如何回退到源码集成。因此,在创建自己的.cmake模块时,可能需要考虑版本控制和兼容性检查,这部分可以结合引用[3]中的Version文件配置。 然后,需要给出一个具体的示例,展示如何编写MyLibConfig.cmake.in和MyLibConfigVersion.cmake文件,以及如何安装它们。引用[3]中的例子可以作为参考,但需要简化,确保用户能够理解每个步骤的目的。 另外,用户可能遇到的问题包括路径设置不正确,如引用[4]中的错误,因为没有正确设置CMAKE_PREFIX_PATH或Qt6_DIR。因此,在回答中需要强调安装后的路径设置,以及如何让其他项目找到这些模块。 最后,总结最佳实践,比如使用现代CMake目标模式、版本控制和测试方法。同时,提供相关问题,帮助用户进一步学习,比如如何处理依赖冲突或交叉编译问题。</think>### CMake自定义模块创建指南(支持find_package) 通过以下5个步骤创建符合CMake规范的模块文件,实现完整的find_package支持: --- #### 一、基础项目结构搭建 ```bash MyLib/ ├── include/ │ └── MyLib.h # 公共头文件 ├── src/ │ └── MyLib.cpp # 实现文件 └── CMakeLists.txt # 主构建文件 ``` *关键配置*: ```cmake # 生成静态/动态 add_library(MyLib STATIC src/MyLib.cpp) target_include_directories(MyLib PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include> $<INSTALL_INTERFACE:include> ) ``` --- #### 二、生成模块配置文件 1. **创建Config模板文件** `MyLibConfig.cmake.in` ```cmake @PACKAGE_INIT@ # CMake自动注入的初始化代码 include("${CMAKE_CURRENT_LIST_DIR}/MyLibTargets.cmake") # 引用导出目标 # 版本验证(引用[3]版本控制) check_required_components(MyLib) ``` 2. **创建版本文件** `MyLibConfigVersion.cmake` ```cmake set(PACKAGE_VERSION "@PROJECT_VERSION@") # 从项目继承版本 # 版本兼容性检查逻辑 if("${PACKAGE_VERSION}" VERSION_LESS "${PACKAGE_FIND_VERSION}") set(PACKAGE_VERSION_COMPATIBLE FALSE) else() set(PACKAGE_VERSION_COMPATIBLE TRUE) if("${PACKAGE_VERSION}" VERSION_EQUAL "${PACKAGE_FIND_VERSION}") set(PACKAGE_VERSION_EXACT TRUE) endif() endif() ``` --- #### 三、安装配置(关键步骤) ```cmake # 生成配置文件(引用[3]的configure_file技术) configure_file(MyLibConfig.cmake.in MyLibConfig.cmake @ONLY) configure_file(MyLibConfigVersion.cmake.in MyLibConfigVersion.cmake @ONLY) # 安装目标导出文件 install(TARGETS MyLib EXPORT MyLibTargets ARCHIVE DESTINATION lib LIBRARY DESTINATION lib RUNTIME DESTINATION bin ) # 安装配置文件(引用[3]路径规范) install(EXPORT MyLibTargets FILE MyLibTargets.cmake DESTINATION lib/cmake/MyLib ) install(FILES "${CMAKE_CURRENT_BINARY_DIR}/MyLibConfig.cmake" "${CMAKE_CURRENT_BINARY_DIR}/MyLibConfigVersion.cmake" DESTINATION lib/cmake/MyLib ) ``` *安装路径规范*:`lib/cmake/<PackageName>` 是CMake的标准搜索路径[^3] --- #### 四、其他项目调用示例 ```cmake # 设置搜索路径(引用[2]的CMAKE_MODULE_PATH说明) list(APPEND CMAKE_PREFIX_PATH "/path/to/MyLib/install") find_package(MyLib 1.0 REQUIRED) target_link_libraries(MyApp PRIVATE MyLib::MyLib) # 现代目标链接方式 ``` *路径解析机制*: 1. 在`CMAKE_PREFIX_PATH`指定目录下查找`lib/cmake/MyLib` 2. 自动加载`MyLibConfig.cmake`和`MyLibTargets.cmake` 3. 验证版本兼容性(引用[3]版本检查) --- #### 五、高级调试技巧 1. **查看搜索路径** ```bash cmake --find-package -DNAME=MyLib -DCOMPILER_ID=GNU -DLANGUAGE=CXX -DMODE=COMPILE ``` 2. **手动指定模块路径** ```cmake set(MyLib_DIR "/custom/path/lib/cmake/MyLib") # 直接指定配置目录 ``` 3. **诊断文件加载** ```cmake set(CMAKE_FIND_DEBUG_MODE TRUE) # 显示详细查找过程 ``` --- #### 六、最佳实践原则 1. **目标传播机制**:使用`target_include_directories`而非`include_directories` 2. **版本控制**:遵循语义化版本规范(Major.Minor.Patch) 3. **交叉编译支持**:设置`CMAKE_SYSROOT`和工具链文件[^4] 4. **组件化设计**:通过`COMPONENTS`参数支持模块化依赖 ---
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值