cmake-find_package链接第三方库

文章目录

之前我们是使用了绝对路径来链接OpenCV第三方库,但是现在很多库一般会自己写一些cmake文件提供给用户,用户可以直接使用其中的内置变量即可。使用的命令就是find_package。

基本调用形式和模块模式

cpp 复制代码
find_package(<PackageName> [version] [EXACT] [QUIET] [MODULE]
             [REQUIRED] [[COMPONENTS] [components...]]
             [OPTIONAL_COMPONENTS components...]
             [NO_POLICY_SCOPE])

查找并载入一个外部包的设置。查找是否成功可以通过_FOUND变量的值得到。成功查找到包后,我们就可以导入包中的目标。使用QUIET选项可以不显示查询过程中产生的信息,比如如果没有使用REQUIRED选项,即使包没有被找到,也不会显示任何信息。使用REQUIRED选项后,如果包没有被找到,就会产生一个错误信息,中断处理。

对于必须的包组件可以在COMPONENTS选项后列出(如果使用了REQUIRED选项,也可以在REQUIRED选项后列出)。对于可选的包组件可以在OPTIONAL_COMPONENTS选项后列出。包自身定义了可用的包组件和包被认为找到的条件。

[version]选项用于指定要查找的包的版本(版本格式为major[.minor[.patch[.tweak]]])。使用EXACT选项后,查找的包的版本需要和指定的版本准确匹配。如果没有使用[version]选项,没有给出需要的包组件列表,就会使用外部调用的相应参数(包括[version]的EXACT选项)。

find_package指令有两种查找包的模式:一种是模块(Module)模式,一种是配置(Config)模式。默认情况下,首先使用模块(Module)模式,如果没有找到对应的模块(Module),就会使用配置(Config)模式。如果使用了MODULE选项,使用模块模式失败后,不会继续使用配置(Config)模式。

模块(Module)模式下,CMake会搜索一个名为Find.cmake。首先使用CMAKE_MODULE_PATH中的路径搜索,然后搜索CMake自带的Find模块。找到Find.cmake后,CMake会读取处理这个文件。这个文件包含了要查找的包的信息。

使用方式

这边我们还是以OpenCV第三方库来进行演示。

CMakeLists.txt

cpp 复制代码
find_package(OpenCV REQUIRED)
add_executable(lesson3_opencv main.cpp)
target_include_directories(lesson3_opencv PRIVATE ${OpenCV_INCLUDE_DIRS})
target_link_libraries(lesson3_opencv PRIVATE ${OpenCV_LIBS})

main.cpp

cpp 复制代码
#include<iostream>

#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>

using namespace std;
using namespace cv;

int main(int argc, char** argv)    
{                                  
	Mat image;
	image = imread("C:/cmake_study/lesson2_opencv/1.jpeg");
	if (image.data == nullptr)
	{
		//cout <<"图片不存在" << endl;
	}
	else
	{
		imshow("meinv", image);
		waitKey(0);
	}

	system("pause");
	return 0;
}

使用这种方式需要注意我们需要把OpenCV的build文件夹指定到系统变量中。

运行结果

相关推荐
小龙报4 分钟前
【51单片机】从 0 到 1 玩转 51 蜂鸣器:分清有源无源,轻松驱动它奏响新年旋律
c语言·数据结构·c++·stm32·单片机·嵌入式硬件·51单片机
石去皿16 分钟前
【嵌入式就业6】计算机组成原理与操作系统核心机制:夯实底层基础
c++·面试·嵌入式
王老师青少年编程16 分钟前
2024年信奥赛C++提高组csp-s初赛真题及答案解析(完善程序第1题)
c++·题解·真题·初赛·信奥赛·csp-s·提高组
一只小小的芙厨1 小时前
AT_tkppc3_d 巨大チェスボード 题解
c++·题解
我在人间贩卖青春1 小时前
C++之继承与派生类的关系
c++·向上造型·向下造型
Trouvaille ~1 小时前
【Linux】应用层协议设计实战(二):Jsoncpp序列化与完整实现
linux·运维·服务器·网络·c++·json·应用层
EmbedLinX1 小时前
嵌入式之协议解析
linux·网络·c++·笔记·学习
wangjialelele1 小时前
Linux中的进程管理
java·linux·服务器·c语言·c++·个人开发
历程里程碑1 小时前
普通数组----轮转数组
java·数据结构·c++·算法·spring·leetcode·eclipse
李日灐1 小时前
C++进阶必备:红黑树从 0 到 1: 手撕底层,带你搞懂平衡二叉树的平衡逻辑与黑高检验
开发语言·数据结构·c++·后端·面试·红黑树·自平衡二叉搜索树