CMAKE查找库:find_package和pkg_check_moduls的区别
本文介绍 CMake 中两种查找库的方式:find_package 以及 pkg_check_modules 的用法与区别。
find_package
如果编译软件使用了外部库,事先并不知道它的头文件和链接库的位置,得在编译和链接命令中加上包含它们的查找路径,CMake 使用 find_package 命令来解决这个问题。
FIND_PACKAGE( <name> [version] [EXACT] [QUIET] [NO_MODULE] [ [ REQUIRED | COMPONENTS ] [ componets... ] ] )
这条命令执行后,CMake 会到变量CMAKE_MODULE_PATH 指示的目录下查找文件 Findname.cmake 并执行;
只要找到包,就会定义下面这些变量(都在 Findname.cmake 文件中设置):
<NAME>_FOUND
<NAME>_INCLUDE_DIRS or <NAME>_INCLUDES
<NAME>_LIBRARIES or <NAME>_LIBRARIES or <NAME>_LIBS
<NAME>_DEFINITIONS
要使用库name,我们在顶层目录中的 CMakeLists.txt 文件中,检查变量**NAME_FOUND** 来确定包是否被找到(大部分包的这些变量中的包名是全大写的,有些包则使用包的实际大小写)
如果找到这个包,我们用**NAME_INCLUDE_DIRS**调用 include_directories() 命令,用**NAME_LIBRARIES**调用 target_link_libraries() 命令。
pkg_check_modules
pkg_check_modules 是 CMake 自己的 pkg-config 模块 的一个用来简化的封装:你不用再检查 CMake 的版本,加载合适的模块,检查是否被加载,等等,参数和传给 find_package 的一样:先是待返回变量的前缀,然后是包名(pkg-config 的)。这样就定义了<prefix>_INCLUDE_DIRS
和其他的这类变量,后续的用法就与 find_package 一致。
pkg_check_modules 实质上是检测系统中的 pkg-config 是否存在指定的 .pc 文件。
pkg-config
- pkg-config is a helper tool used when compiling applications and libraries. It helps you insert the correct compiler options on the command line so an application can use
gcc -o test test.c pkg-config –libs –cflags glib-2. 0
for instance, rather than hard-coding values on where to find glib (or other libraries).
It is language-agnostic, so it can be used for defining the location of documentation tools, for instance. 输出已安装的库的相关信息,包括:
C/C++编译器需要的输入参数
链接器需要的输入参数
已安装软件包的版本信息
pkg-config works on multiple platforms: Linux and other UNIX-like operating systems, Mac OS X and Windows. It does not require anything but a reasonably well working C compiler and a C library, but can use an installed glib if that is present. (A copy of recent glib2 is shipped together with pkg-config versions since 0.27, and this is sufficient for pkg-config to compile and work properly.)
工作原理:当安装一个库时(例如从 RPM,deb 或其他二进制包管理系统),会包括一个后缀名为 pc 的文件,它会放入某个文件夹下 (依赖于你的系统设置,例如,Linux 为 该库文件所在文件夹/lib/pkgconfig)。并把该子文件夹加入 pkg-config 的环境变量PKG_CONFIG_PATH
作为搜索路径。
find_package() 寻找 cmake 目录下的 .cmake 配置文件,可能位于 /usr/lib/cmake 或者 /usr/local/lib/cmake 目录下
pkg_check_module() 寻找 pkgconfig 目录下的 .pc 配置文件,同样也可能位于上述目录下
what is the difference between find_package and pkg_search_module
pkg_search_module使用pkg-config工具确定请求的库的位置。这在已经使用pkg-config的系统上最有用,因此您不需要为CMake复制所有信息。请注意,此方法存在潜在的可移植性问题,因为它要求在构建计算机上正确设置pkg-config。
另一方面,find_package是CMake自己解决相同问题的机制。为此,您可能需要一个用于请求的库的CMake查找脚本(CMake已经附带了其中的两个,但您可以轻松编写自己的脚本),或者是由请求的库本身提供的软件包配置脚本。无论哪种情况,您都可能需要调整CMAKE_MODULE_PATH才能使CMake能够找到相应的脚本。
使用哪种选择非常简单:如果库提供的话,优先选择软件包配置脚本。
使用查找脚本作为不了解CMake的库的后备。
如果要利用pkg-config的协同作用,请使用pkg_search_module。特别是,请注意,可以使用pkg_search_module来实现查找脚本,作为获取所需信息的一种方法。
CMAKE查找库:find_package和pkg_check_moduls的区别相关推荐
- cmake添加查找目录_CMake如何查找库路径(一)
CMake如何查找库路径(一) 如果你的代码使用了外部库(external libraries),并且你事先不知道这些库的头文件和库文件在当前平台的位置.那么适当的文件夹路径和库的搜索路径就应该被添加 ...
- CMake命令:find_package、make instal、make --build .、CMAKE_PREFIX_PATH、add_compile_options、set_property
1.find_package 作用: 帮助查找工程依赖的包(lib.so)文件. 1.1.两种查找模式: 两种模式均为在指定路径下查找指定类型cmake文件来查找依赖的包,差异为两模式的查找路径不同. ...
- 使用cmake查找onnx
使用cmake查找onnx 1.写onnx.cmake文件 1.写onnx.cmake文件 使用时可参考下面的修改后使用. onnxruntimeVersion.cmake # Custom cmak ...
- iOS架构-静态库.a 和.framework的区别(0)
原文网址:https://my.oschina.net/kaqijiang/blog/649632 一.什么是库? 库是共享程序代码的方式. 库从本质上来说是一种可执行代码的二进制格式,可以被载入内存 ...
- PathFinding.js – 综合性的 JavaScript 路径查找库
PathFinding.js 是一个综合性的 JavaScript 路径查找库.这个项目的目的是提供一个可以很容易地纳入网页游戏的路径查找库.它可以运行在 Node.js 或浏览器中.提供的在线演示展 ...
- c运行库、c标准库、windows API的区别和联系
c运行库.c标准库.windows API的区别和联系 C运行时库函数 C运行时库函数是指C语言本身支持的一些基本函数,通常是汇编直接实现的. API函数 API函数是操作系统为方便用户设计应用 ...
- AD2020库安装及查找库
AD2020库安装及查找库 本人使用的是AD20.0.13版本的画图软件,用习惯了AD14突然用AD20有点不适应,加上网上使用教程有点少,英语不好的只能慢慢摸索.下面说一下AD20怎么添加元件库,以 ...
- 理解前端框架、前端库,两者有什么区别
一.前端框架(Framework).前端库(Library)两者的概念和区别是什么 前端框架和库都是前端开发中常见的概念,它们的区别在于它们所解决的问题不同. 1.1.前端框架(Framework)是 ...
- linux程序 都用libc,uClinux的通用c库:uC-libc和uClibc的区别概述
uClinux的通用c库:uC-libc和uClibc的区别概述 (2006-09-13 19:49:04) uClinux通常使用两种c库:uC-libc和uClibc.尽管它们名字近似,但有很大区 ...
最新文章
- assign和always组合逻辑块,孰优孰劣?
- 06_pandas入门教程,引包,使用DataFrame和Series做一些事情
- PHP开发中csrf攻击的简单演示和防范
- php mongodb 子查询,MongoDB数组子查询elemMatch
- 斗地主AI算法——第二章の数据结构
- ElementUI 按需引入坑爹的点记录
- Soem配置汇川SV660N
- libcef-常用概念-框架特点
- RAID 0/1/5/6/00/(10/01)/50/60磁盘阵列逻辑容量计算公式
- Paper:2020.02.09钟南山团队首篇新冠病毒论文《Clinical characteristics of 2019 novel coronavirus infection in China》
- 《一只特例独行的猪》摘抄
- 血淋淋的BUG:波音在软件开发上错在哪里?
- 教师节祝福短信:送给有个性的老师
- 如何免费使用正版win10系统
- 2023年品牌营销趋势是什么?如何提升品牌知名度
- 招聘路径规划算法工程师岗位
- ICCV 2021 结果出炉!最全论文下载及分类汇总(更新中)
- 无线定位技术实验二 TDOA最小二乘定位法
- TICC2540 HAL KEY服务学习记录
- EasyUI1.11.1 出现错误: TypeError: _2ad is undefined if (_2ad.onClose) {
热门文章
- 方面级paper8Progressive Self-Supervised Attention Learning for Aspect-Level Sentiment Analysis(2019ACL)
- MATLAB中smoothdata函数使用
- android 手机美化
- Xposed原理与应用Api
- 【Halcon】计算区域圆度:circularity
- .NET作业调度 Quartz.NET
- Python爬虫-IP代理池和代理池设计
- 网络编辑器插件ckeditor+ckfinder配置
- wan ip 和 lan ip知识
- c语言 10分苹果,POJ1664 放苹果 递归 C语言