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文件夹指定到系统变量中。

运行结果

相关推荐
虾球xz1 小时前
游戏引擎学习第282天:Z轴移动与摄像机运动
c++·学习·游戏引擎
.小墨迹1 小时前
Apollo学习——planning模块(3)之planning_base
linux·开发语言·c++·学习·自动驾驶
龙湾开发1 小时前
计算机图形学编程(使用OpenGL和C++)(第2版)学习笔记 10.增强表面细节(一)过程式凹凸贴图
c++·笔记·学习·3d·图形渲染
德亦周2 小时前
如何在Mac电脑上的VScode去配置C/C++环境
c++·vscode·macos
XiaoyaoCarter2 小时前
每日一道leetcode(新学数据结构版)
数据结构·c++·算法·leetcode·职场和发展·哈希算法·前缀树
八月的雨季 最後的冰吻2 小时前
SIP协议栈--osip源码梳理
linux·服务器·网络·c++·网络协议
fancy1661663 小时前
搜索二维矩阵 II
c++·算法·矩阵
freyazzr3 小时前
Leetcode刷题 | Day63_图论08_拓扑排序
数据结构·c++·算法·leetcode·图论
顾子茵3 小时前
c++从入门到精通(四)--动态内存,模板与泛型编程
java·开发语言·c++
ai.Neo4 小时前
牛客网NC22015:最大值和最小值
数据结构·c++·算法