Cmake学习之find_package

CMAKE 编写 FindXXX.cmake 首先为什么要写 FindXXX.cmake 对于一个大型项目,作为一个合格的开发人员来说,特别是C/C++开源人员。会一门编译工具非常重要。在一个大型项目中,使用过Makefile 的肯定感觉到问题就是,当项目庞大的时候,越到后面的库或者进程,依赖的头文件,库将会越来越多。在写makefile也是一件非常痛苦的一件事。相信这个问题,不只是在Makefile 中存在,cmake 中也会存在。 那么如果,可以让编译过后的库自己解决,自己的依赖。是不是就可以解决这个问题呢? cmake提供这样的方法: find_ 阅读详情

find_package可以用来查找第三方模块,find_package的两种模式,一种是Module模式,另一种叫做Config模式

(1)在Module模式中,cmake需要找到一个叫做Find<LibraryName>.cmake的文件。这个文件负责找到库所在的路径,为我们的项目引入头文件路径和库文件路径。cmake搜索这个文件的路径有两个,一个是上文提到的cmake安装目录(即CMAKE_ROOT变量)下的share/cmake-<version>/Modules目录,另一个是我们指定的CMAKE_MODULE_PATH的所在目录。使用时不需要加后缀.cmake

(2)如果Module模式搜索失败,没有找到对应的Find<LibraryName>.cmake文件,则转入Config模式进行搜索。它主要通过<LibraryName>Config.cmake or <lower-case-package-name>-config.cmake这两个文件来引入我们需要的库。

# 定位到某个包
set(OpenCV_DIR "/usr/lib/opencv_300/build")

查找多个包的配置文件,可以将这些配置文件都统一放在一个命名为cmake的文件夹下,然后设置变量CMAKE_PREFIX_PATH变量指向这个cmake文件夹路径,需要注意根据上述的匹配规则,此时每个包的配置文件需要单独放置在命名为包名的文件夹下(文件夹名不区分大小写),否则会提示找不到。

如果找到了模块则CMake会定义这几个变量XXX_FOUND、XXX_INCLUDE_DIRS(头文件目录)、XXX_LIBRARIES(库文件)、XXX_LINK_DIRECTORIES(库所在目录)

如:OpenCV_FOUND、OpenCV_INCLUDE_DIRS等

# 一个简单示例
cmake_minimum_required(VERSION 3.4.1)
project(helloworld)
add_executable(helloworld hello.c)
find_package(BZip2)
if(BZIP2_FOUND)
	include_directories(${BZIP_INCLUDE_DIRS})
	target_link_libraries(helloworld ${BZIP2_LIBRARIES})
endif(BZIP2_FOUND)

对于原生支持Cmake编译和安装的库通常会安装Config模式的配置文件到对应目录,这个配置文件直接配置了头文件库文件的路径以及各种cmake变量供find_package使用。而对于非由cmake编译的项目,我们通常会编写一个Find<LibraryName>.cmake,通过脚本来获取头文件、库文件等信息。通常,原生支持cmake的项目库安装时会拷贝一份XXXConfig.cmake到系统目录中,因此在没有显式指定搜索路径时也可以顺利找到。

(3)如果没有.cmake文件而且自己不想写.cmake文件,那就不用find_package,简单粗暴:

#find_package就是这么实现的
#头文件目录(是个目录的绝对路径)
find_path(<NAME_INCLUDE_DIRS> NAMES XX.h PATHS /usr/include /usr\local/include/ ...)
#库文件(是个文件的绝对路径)
find_library(<NAME_LIBRARIES> NAMES lib-name PATHS /usr/lib /usr/local/lib ...)

CMAKE_INCLUDE_PATH:find_path默认会去这里找,当然指定写到PATHS后面更好
CMAKE_LIBRARY_PATH:find_library默认会去这里找,当然指定写到PATHS后面更好

set(CMAKE_INCLUDE_PATH /usr/local/include/opencv
	                   /usr/include)
find_path(CV_INCLUDE_DIRS NAMES cv.h PATHS CMAKE_INCLUDE_PATH)
Cmake文件写法示例
# 在指定目录下寻找头文件和动态库文件的位置,可以指定多个目标路径
find_path(ADD_INCLUDE_DIR libadd.h /usr/include/ /usr/local/include ${CMAKE_SOURCE_DIR}/ModuleMode)
find_library(ADD_LIBRARY NAMES add PATHS /usr/lib/add /usr/local/lib/add ${CMAKE_SOURCE_DIR}/ModuleMode)

if (ADD_INCLUDE_DIR AND ADD_LIBRARY)
    set(ADD_FOUND TRUE)
endif (ADD_INCLUDE_DIR AND ADD_LIBRARY)
关键字解释

version和EXACT: 都是可选的,version指定的是版本,如果指定就必须检查找到的包的版本是否和version兼容。如果指定EXACT则表示必须完全匹配的版本而不是兼容版本就可以。

QUIET可选字段,表示如果查找失败,不会在屏幕进行输出(但是如果指定了REQUIRED字段,则QUIET无效,仍然会输出查找失败提示语)。

MODULE 可选字段。前面提到说“如果Module模式查找失败则回退到Config模式进行查找”,但是假如设定了MODULE选项,那么就只在Module模式查找,如果Module模式下查找失败并不回落到Config模式查找。

REQUIRED可选字段。表示一定要找到包,找不到的话就立即停掉整个cmake。而如果不指定REQUIRED则cmake会继续执行。

COMPONENTS,components:可选字段,表示查找的包中必须要找到的组件(components),如果有任何一个找不到就算失败,类似于REQUIRED,导致cmake停止执行。

cmake编译opencv示例

CMakeLists.txt

cmake_minimum_required(VERSION 3.14.4) # cmake最小版本限制

PROJECT(test) 

message("${PROJECT_SOURCE_DIR}/opencv-3.4.1")

# 寻找OpenCV库
set(OpenCV_DIR "${PROJECT_SOURCE_DIR}/opencv/opencv/build")
find_package(OpenCV REQUIRED)

# 打印信息
message(STATUS " version:${OpenCV_VERSIOn}")
message(STATUS "libraries:${OpenCV_LIBS}")
message(STATUS "include path:${OpenCV_INCLUDE_DIRS}")

# 添加头文件
include_directories(${OpenCV_INCLUDE_DIRS})

# 将原代码添加到此项目的可执行文件
add_executable(test_opencv test_opencv.cpp)

# 链接OpenCV库
target_link_libraries(test_opencv ${OpenCV_LIBS} )

注:window环境需要下载官方exe文件进行安装opencv。使用cmake编译opencv源码因库文件不足会出错

test_opencv.cpp

#include <iostream>
#include <opencv2/opencv.hpp>

using namespace std;
using namespace cv;

int main()
{
	// 读入一张图片
	Mat img = imread("D:\\Code\\demo\\demo.png");
	// 创建一个名为 "图片"窗口    
	namedWindow("图片");
	// 在窗口中显示图片   
	imshow("图片", img);
	// 等待6000 ms后窗口自动关闭    
	waitKey(6000);
	// system("pause");
    return 0;
}
【cmake学习】find_package 详解 阅读详情

相关推荐

【cmake】自定义Findxxx.cmake模块

在一个项目当中,我们自己的可执行文件和库文件很有可能去引入和链接其他库文件,例如一个demo可执行文件需要去链接一个名为libadd.so# 引入头文件路径# 引入库文件路径# 链接目标库。

南_无_生的博客 2349

“轻松搞定 CMake”系列之 find_package 用法详解

在没有 CMake 的时代,这种库查找链接的工作都需要借助 MakeFile 中的各种命令来完成,非常的繁琐,而且不方便移植,到了 CMake 时代,CMake 给我们提供了 find_package() 命令用来查找依赖包,理想情况下,一句 find_package() 命令就能把一整个依赖包的头文件包含路径、库路径、库名字、版本号等情况都获取到,后续只管用就好了。所谓“找到”这些库,其实是根据我们的需要找到指定版本的库头文件包含路径、链接库路径等,从而能够满足我们开发项目的编译链接需要。

布袋和尚 1万+

【学习cmake】cmake如何使用链接库 (link_directories, LINK_LIBRARIES, target_link_libraries,FIND_PACKAGE)实践篇2

cmake中添加引用动态链接和静态链接库 ADD_EXECUTABLE(a.out ./main.cpp) TARGET_LINK_LIBRARIES(a.out /usr/lib/libeg.so) 动态库的添加: link_directories(${PROJECT_SOURCE_DIR}/lib) #添加动态连接库的路径 target_link_libraries(project_na...

开源节流 4万+

cmake之find_pakage(详细版)

基本签名和模块模式¶ find_package(<PackageName> [version] [EXACT] [QUIET] [MODULE] [REQUIRED] [[COMPONENTS] [components...]] [OPTIONAL_COMPONENTS components...] [NO_POLICY_SCOPE])cs 查找并从外部项目加载设置。 <PackageName>_FOUN

ahelloyou的博客 4053

cmake find_package、引用GDAL 初步学习

cmake find_package 指令的基本功能是查找第三方库;

bcbobo21cn的专栏 986

Java后端中的链路追踪:使用OpenTelemetry实现全链路监控

在现代的微服务架构中,链路追踪是监控和优化系统性能的关键技术。通过链路追踪,我们可以跟踪请求在系统中的流转,识别性能瓶颈,定位问题根源。本文将介绍如何在Java后端应用中使用OpenTelemetry实现全链路监控,包括具体的实现步骤和代码示例。通过集成OpenTelemetry,您可以实现全面的链路追踪,帮助您识别瓶颈和潜在问题,从而提升系统的可靠性和用户体验。OpenTelemetry是一个开源项目,旨在提供统一的工具集来收集、处理和导出应用程序的遥测数据,包括跟踪、度量和日志。

聚娃科技开发者博客 1726

CMake中find_package的学习

在CMakeLists.txt编译时经常会遇到的一个问题是找不到相应的package,例如报错如下: CMake to find a package configuration file provided by "catkin", but CMake did not find one. Could not find a package configuration file provided by "catkin" with any of the following names: catkinConfig

weixin_44991673的博客 1530

AD20/Altium designer——元器件批量命名与编号的高效技巧

本文详细介绍了在AD20/Altium Designer中实现元器件批量命名与编号的高效技巧。通过解析核心的“原理图标注”功能,从基础全局操作到进阶的按模块分区、利用标识符及合并BOM等智能方法,帮助硬件工程师彻底告别手动编号,大幅提升设计效率与文档规范性,并融入了一套完整的实战工作流。

whisky的博客 567

CMake学习笔记:find_package

CMake学习笔记:find_package的使用。内容包含“依赖第三方库“和”编辑.cmake文件“的示例项目完整源代码。

小笛子的博客 1732

从TCGA官网获取新版count数据并精准转换为TPM的实战指南

本文详细介绍了从TCGA官网获取新版count数据并精准转换为TPM的实战指南。通过TCGAbiolinks工具下载原始count数据,结合GENCODE v36注释文件计算基因有效长度,最终实现count到TPM的标准化转换,确保数据完整性和分析可靠性。文章包含完整代码示例和常见问题解决方案,特别适合生物信息学研究人员参考。

weixin_27310417的博客 282

AirSim中图像API的应用

解析Airsim图像获取保存的api

fegxg的博客 1603

CMake学习日志之find_package

转载总结自深入理解CMake(3):find_package()的使用 CMake学习日志之find_package 一、首先明确一下默认查找的路径 <package>_DIR CMAKE_PREFIX_PATH CMAKE_FRAMEWORK_PATH CMAKE_APPBUNDLE_PATH PATH 二、了解一下find_package()的两种模式 find_package(...

狗剩没有饭吃 1864

【Python办公】剪贴板记录工具(记录文本 + 图片防重复)

本文介绍了一个用Python开发的剪贴板记录工具,能够自动记录复制过的文本和图片内容。该工具使用tkinter构建GUI界面,通过后台线程实时监控剪贴板变化,具有文本记录、图片保存(自动去重)功能。核心代码采用pyperclip访问剪贴板,PIL处理图片,hashlib计算图片哈希值实现去重。运行程序后,文本内容直接显示在界面,图片保存为PNG文件并记录路径。工具还提供清空历史记录功能,适合日常办公中需要追踪剪贴板历史的使用场景。

weixin_42636075的博客 237

cmake中添加引用动态链接_Cmake学习find_package

参考文献CMake之find_package​www.jianshu.com简书​link.jianshu.com孟paper:cmake find_package路径详解​zhuanlan.zhihu.comCMake说起来是个好东西,可是真正用的时候并不那么容易,很容易出现各种各样的错误。这不,最近就被find_package这个命令折腾得死去活来。只好花了一天半时间,看上面那本书,再查资料,...

weixin_35799770的博客 333

【第1章>第5节】SOM自组织映射网络的理论学习与MATLAB仿真

自组织映射网络(Self-Organizing Map,SOM)是一种无监督学习的人工神经网络,由芬兰学者Teuvo Kohonen于1981年提出,也被称为Kohonen网络。它的主要功能是将高维输入数据映射到低维(通常是二维)的离散网格上,同时保持输入数据的拓扑结构,即相邻的输入数据在映射后的网格上也相邻。

FPGA/MATLAB学习教程/源码/项目合作开发 399

61、增益调度控制器:原理、建模与调优

本文详细介绍了增益调度控制器的原理、建模方法和调优流程。增益调度是一种针对非线性系统的控制策略,通过在不同工作点使用不同的线性控制器实现全局控制。文章涵盖了在Simulink中使用Control System Toolbox模块建模的具体步骤,以及如何利用systune进行增益调度表的调优。同时,还讨论了实际应用中的注意事项、典型案例(如化学反应器和飞机控制),并与其它控制方法进行了对比。最后,文章展望了增益调度控制器的未来发展趋势,包括与人工智能的结合、多目标优化调优以及实时调优能力的提升。

rgv234567的博客 186

.so 依赖目录 cmake_Cmake学习find_package

参考文献CMake之find_package​www.jianshu.com简书​link.jianshu.com孟paper:cmake find_package路径详解​zhuanlan.zhihu.comCMake说起来是个好东西,可是真正用的时候并不那么容易,很容易出现各种各样的错误。这不,最近就被find_package这个命令折腾得死去活来。只好花了一天半时间,看上面那本书,再查资料,...

weixin_39875028的博客 161

YOLO11有效改进专栏目录

YOLO11改进专栏导航

A1983Z的博客 3673

【CMake学习】find_package() 引入外部依赖包

通过CMake引入官方库 cmake官方为我们预定义了许多寻找依赖包的Module,他们存储在path_to_your_cmake/share/cmake-/Modules目录下。如下图: xxxxxxxxx:/usr/share/cmake-3.16/Modules$ ls | grep FindC CMakeFindCodeBlocks.cmake FindCABLE.cmake FindCoin3D.cmake FindCUDA FindCUDA.cmake FindCups.cmake FindCU

m0_47448477的博客 914

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Cmake学习笔记(四)find类指令 以FIND_PACKAGE()为例

Cmake Find类指令 以FIND_PACKAGE()为例,我们用OpenCV为实例来看 我们需要为工程设置依赖的头文件和库时,往往需要以下方法 include_directiories(../include) target_link_libraries(proTest ../OpenCV) 但是,opencv需要以来的动态库有时非常多,那我们一个个路径来配置么,肯定会比较麻烦,这时就会需要...

黄胶鞋和七分裤 1147

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

CMAKE学习笔记--find_package

main中的CMakeLists.txt通过find_package()函数去找到hello_DIR路径下helloConfig.cmake,从而得到hello_INCLUDE_DIRS,hello_LIBS两个变量值。第四句:fing_package所做的事情就是根据xxx_DIR路径找到xxxConfig.cmake文件,然后执行该文件得到xxx_INCLUDE_DIRS和xxx_LIBS变量,前者存放了所需要的头文件路径,后者指向了所需要用到的库路径。再来看world的CMakeLists.txt。

weixin_44194690的博客 892

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

cmake学习(二) 创建库并使用find_package查找包

Mastering_CMake的第五章创建自己的包,并在其他的工程中使用find_package查找自己的创建的包 ide是clion,gcc环境是MinGW 工程目录和文件 1、创建一个源文件gromit.cpp和头文件gromit.h作为自己创建的包的对象,gromit.cpp中只有一个函数,打印一条消息 gromit.h文件 class gromit { public: void info(); }; gromit.cpp文件 #include <iostream&

mylove10086 2056

【学习cmake】find_package与CMake查找链接库 实践篇

cmake 生成供find_package使用的自定义模块 cmake中经常使用find_package寻找模块,使用起来非常方便.find_package的原理是什么呢?如何自己写个模块提供给别人使用?如果别人希望用find_package的形式使用你的模块中的库,我该如何用cmake写这个库呢? 下面用一个例子来说明: myapp程序通过find_package调用mylib中的库 1.my...

开源节流 1420

cmake学习(二)引用外部库(find_package分析)

案例:lio-sam-linux项目的CMakeLists.txt 通过这个例子学习一下引用外部库的相关内容。 (貌似项目本身的构建结构不太符合规范,这个后面再修改。,。) 项目路径: CMakeLists.txt cmake_minimum_required(VERSION 2.8.3) project(lio_sam_linux) #set命令可以设置普通变量、缓存条目、环境变量三种变量的值。 set(CMAKE_BUILD_TYPE "Release") set(CMAKE_CXX_FLAGS "

qq_38170211的博客 1655

【学习cmake】find_package与CMake如何查找链接库详解 高级篇 理论篇

如果编译软件使用了外部库,事先并不知道它的头文件和链接库的位置。得在编译命令中加上包含它们的查找路径。CMake使用 find_package 命令来解决这个问题。本文讨论了如何在CMake项目中使用外部库,以及如何给没有查找模块的库写一个。 初识 https://blog.youkuaiyun.com/KYJL888/article/details/85109782 1 FIND_PACKAGE FI...

开源节流 3103

CMake学习笔记06--find_package的使用

find_package的使用

zhouyuming_hbxt的博客 500
上一篇: Cmake学习之cmake入门
下一篇: mmsegmentation训练HRF数据集
Thinkobj
博客等级 码龄8年 10粉丝 31原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值