1、find_package命令基本介绍
在实际开发过程中,经常不可避免的会使用到第三方开源库,这些开源库可能是通过apt-get install 命令自动安装到系统目录,也可能是由我们自己下载库的源码然后通过编译安装到指定目录的。
不管哪种方式安装的库文件,如果我们需要在自己的项目中使用这些库,首先面临的第一个问题就是如何找到这些库。也就是说,根据我们的需要找到指定本版的库头文件包含路径、链接库路径等,从而能够满足我们开发项目的编译链接需要。
CMake提供了find_package()命令用来查找以来包,理想情况下,一句find_package()命令就能把一整个依赖包的的头文件包含路径、库路径、库名字、版本号等情况都获取到,后续只管用就好了。但实际使用过程肯呢个会出现这样那样的问题,因此需要我们对find_package这个强大的命令有个大概的理解。
2、一个使用find_package命令的例子
例子说明:用OpenCV库举例子,示范如何通过find_package命令找到OpenCV库并配置,从而能够在我们自己的项目中调用OpenCV库,实现特定的功能。
下面的代码主要实现了利用OpenCV载入一张图片并进行显示。
opencv_test.cpp
#include "opencv2/core.hpp"
#include "opencv2/highgui.hpp"
#include <iostream>
using namespace std;
using namespace cv;
int main(){
Mat image;
image = imread("../flower.jpg");
if(!image.data){
cout <<"No image data\n";
return -1;
}
namedWindow("Display Image", WINDOW_AUTOSIZE);
imshow("Display Image", image);
waitKey(0);
return 0;
}
CMakeLists.txt:
cmake_minimum_required(VERSION 3.5)
project(opencv_example LANGUAGES CXX)
# Enable C++11
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
# 搜索OpenCV的头文件路径、库文件路径等信息
# REQUIRED 表示一定要找到包,否则立即停掉整个CMake
find_package(OpenCV REQUIRED)
# 打印
message(STATUS " config: ${OpenCV_DIR}")
message(STATUS " version: ${OpenCV_VERSION}")
message(STATUS " include: ${OpenCV_INCLUDE_DIRS}")
message(STATUS " libraries: ${OpenCV_LIBS}")
# 可以不用指定关于Opencv的头文件、库的搜索路径
#include_directories(${OpenCV_INCLUDE_DIRS})
#link_directories(${OpenCV_DIR})
# 生成可执行二进制文件
add_executable(opencv_example main.cpp)
# Link your application with Opencv libraries
target_link_libraries(opencv_example PRIVATE ${OpenCV_LIBS})
2.1 编译运行
在源码路径打开终端,执行
mkdir build
cd bild
cmake ..
make
在源码路径下放置一张图片并命名为flower.jpg,运行:
./opencv_example
2.2 编译输出与分析
执行cmak ..命令时输出为:
-- The CXX compiler identification is GNU 11.3.0
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Found OpenCV: /usr/local (found version "4.5.0")
-- config(OpenCV_DIR): /usr/local/lib/cmake/opencv4
-- version: 4.5.0
-- include: /usr/local/include/opencv4
-- libraries: opencv_calib3d;opencv_core;opencv_dnn;opencv_features2d;opencv_flann;opencv_gapi;opencv_highgui;opencv_imgcodecs;opencv_imgproc;opencv_ml;opencv_objdetect;opencv_photo;opencv_stitching;opencv_video;opencv_videoio
-- Configuring done
-- Generating done
-- Build files have been written to: /home/lrj/work/opencv_example/build
3、注意
CMake本身不提供任何搜索库的便捷方法,所有搜索库并给变量复制的操作必须由CMake代码完成,也就是OpenCV_DIR目录下的<PackageName>Config.cmake或Find<PackageName>.cmake的配置文件。只不过库的作者通常会提供这两个文件,以方便使用者调用。
如果这个以来保是我们自己开发的,应该如何配置这个包生成这些配置文件,从而能够被其他项目利用find_package命令来配置我们自定义的包呢?
这就需要学习如何使用Cmake封装自己软件包。(原博主暂时未更新此部分)
另外find_package命令有两种工作模式,这两种工作模式的不同决定了其搜包路径的不同,有兴趣的可以看看下面这个链接,初学者暂时学到这里,有需要再补充学习:“轻松搞定CMake”系列之find_package用法详解_zhanghm1995的博客-CSDN博客_find_package
其实还有好多东西可以学,比如target_link_libraries这个指令可以详细了解下等等。但是作为初学者,不要贪多,一定要明确自己现在学的部分是服务哪个分支,而不是一网下去什么鱼都想捞上来。
参考:文章来源:https://www.toymoban.com/news/detail-456642.html
“轻松搞定CMake”系列之find_package用法详解_zhanghm1995的博客-CSDN博客文章来源地址https://www.toymoban.com/news/detail-456642.html
到了这里,关于CMake学习笔记:搜索第三方库及头文件路径 find_package()命令的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!