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

运行结果

相关推荐
小小、码农5 小时前
C++11右值引用与移动语义 —— 从拷贝资源到转移资源
开发语言·网络·c++·网络协议
charlie1145141916 小时前
C++ 的新标准容器:flat_map、inplace_vector 与 mdspan
开发语言·c++·开源项目
唠玖馆6 小时前
c++AVL树
开发语言·c++
蒸蒸yyyyzwd7 小时前
CPP 选手秋招学习笔记 day31
c++·求职招聘
linx2958 小时前
单元三 · 那 C 的底层知识怎么办
c语言·开发语言·数据结构·c++·嵌入式硬件
汉克老师8 小时前
GESP 六级明日冲刺:最后一晚只抓两个大方向
c++·gesp·小学生·学c++编程
神仙别闹9 小时前
基于 QT(C++)开发的地铁换乘系统
数据库·c++·qt
Dr_Fourier9 小时前
mmap的使用与底层原理
linux·c++
Tairitsu_H10 小时前
[C++] C++11右值引用与移动语义揭秘
开发语言·c++·c++11·右值引用·移动语义