当前位置: 首页 > news >正文

pkg-config介绍

接着前面的博客,此篇不聊ROS2,聊聊pkg-config的使用

一. 概念了解

1. pkg-config 只是查询工具,只负责读取.pc文件输出编译参数,不具备下载、编译、安装软件的能力。

.pc是 pkg-config 的配置文件,作用: 编译时自动提供库的-I头文件路径、-L库目录、-l链接名、编译宏、版本、依赖等参数。 只要项目 / 库支持pkg-config, 就会提供对应的.pc文件。比如:

# 一次性拼接参数编译 g++ main.cpp -o main `pkg-config --cflags --libs opencv4`

很多童鞋接触它,是因为配置Opencv的原因,但得知道不仅仅opencv带.pc文件,用于被pkg-config管理。诸如fftw3.pc,eigen3.pc文件。拿博主Jetson Orin Nano板子上来看,

2. 安装pkg-config,可使用如下命令

sudo apt update sudo apt install pkg-config

3. 生成.pc文件的方式

1)apt/dnf 系统包安装(libxxx-dev)- 绝大多数会自动带.pc,无需手动开启

2)源码编译的时候,开启pkg-config功能

Autotools(./configure && make)老牌库:默认自动生成.pc,无开关,代表库:libpng、zlib、fftw、glib、libjpeg、v4l-utils

Meson构建(现代图形库:gtk4、gstreamer、libcamera):默认开启自动生成 pc

CMake构建(OpenCV、Ceres、g2o、PCL、Eigen)- 分库,开关名称不统一,必须手动加参数开启

CMake 库没有统一标准开关,每个库自定义 option,不写对应开关就不会生成.pc。我们拿opencv来举例。

如何使用编译工具编译Opencv的方法见如下博客【如下当时是做交叉编译】,可看到图形化编译工具可以直接去勾选很多设置选项,从而对是否生成.pc文件进行管控。

Ubuntu下的基本知识点(二)_libxcb-CSDN博客

Ubuntu交叉编译含有Opencv功能的程序并在树莓派上执行_树莓派交叉编译opencv-CSDN博客

二. 默认库或默认搜索文件路径

1. 编译和运行程序时,系统预制了一套默认,公共路径,系统自带软件、apt 安装的库放在里面,开箱即用。省的在~/.bashrc中手动去添加搜索路径。但碰到源码编译安装软件,或者想多版本共存时,不想去破坏其它已有的目录,但又想容易切换版本,那么可以去手动添加自定义路径,自己去配置。

2. 如下代码可查看默认的搜索路径(不需要在~/.bashrc中手动添加)

ld --verbose | grep SEARCH_DIR | tr -s ' ;' '\n'

3. 拿opencv举例,我们先看下系统上生效的opencv的版本

pkg-config --modversion opencv4

如下命令可查看完整编译参数(包含路径)

pkg-config --cflags --libs opencv4

4. 含有多个Opencv版本时,就会有多个对应的opencv.pc配置文件,如下命令可查找文件位置

sudo find /usr -name "opencv4.pc" 2>/dev/null

5. 我们去打开这个两个文件,分别看下opencv的版本

6. 由于上面第3步打印了当前opencv的版本,输出是4.10.0版本,那么便可知用的哪个位置的opencv版本了。这里我们创建test_opencv.cpp,简单测试下,代码如下:

#include <opencv2/core/core.hpp> #include <opencv2/opencv.hpp> #include <iostream> using namespace cv; using namespace std; int main() { Mat img = imread("/home/jetson/myfiles/lena_color_256.tif"); std::cout << "read ok" << std::endl; imshow("image", img); waitKey(0); return 0; }

运行效果如下:

这里由于Ubuntu的默认搜索位置下,存在.pc文件,所以并不需在~/.bashrc文件中手动添加路径,省去了一些操作。

三.自己手动添加路径

如果默认搜索路径下没有.pc文件,或者想指定opencv的版本(切换版本),

比如切成上面/usr/lib/aarch64-linux-gnu下的,那么可以打开~/.bashrc,在里面增加如下语句

结束后,别忘了加source ~/.bashrc语句更新下环境

再次执行如下语句

使用如下命令行编译,都可以成功运行

g++ test_opencv.cpp -o test_opencv.out $(pkg-config --cflags --libs opencv4) -lpthread -lrt -ldl aarch64-linux-gnu-g++ test_opencv.cpp -o test_opencv.out $(pkg-config --cflags --libs opencv4) -lpthread -lrt -ldl

所以很多库路径虽然在~/.bashrc中没有手动看到,但不表示其没有安装,只是它放在了很多默认搜索路径下。apt安装时默认会装到默认搜索路径下么,所以不用手动在~/.bashrc中配置。如上例子也说明了通过opencv.pc配置的简便性。

如上只是说明默认搜索路径,以及手动添加路径的好处,同时能看到这也是切换版本的方法之一。

附:如下命令可查看Jetson Orin Nano板子的架构

本机编译程序:直接用系统自带g++(target:aarch64-linux-gnu

http://www.jsqmd.com/news/1075167/

相关文章:

  • Gemma 4 微调 商品分类
  • 吾爱出品,相当炸裂!!
  • 2026零基础录音转文字入门指南避坑教学包教包会看完可直接上手
  • VisualCppRedist AIO:Windows运行库的“瑞士军刀“如何解决你的软件兼容性难题
  • 如何用3分钟解锁15+加密音乐格式:浏览器中的音乐自由革命
  • Java应用启动慢、接口超时、频繁Full GC?别再把锅甩给JVM了!
  • TVA在物流分拣领域的独特价值(8)
  • git项目目录下创建git忽略上传文件
  • 免费开源视频对比工具完全指南:如何像专家一样发现视频差异
  • 从0到1:企业级AI项目迭代日记 Vol.53|功能没做错,边界没接对
  • 【操作系统】进程调度算法(FCFS/SJF/优先级/时间片轮转)
  • 油层物理——2. 储层流体的物化性质
  • Android Studio中文汉化终极指南:5分钟打造母语级开发环境
  • 如何解决小说创作中的组织混乱问题:使用Bibisco的完整解决方案
  • 汽车电子智能分布式控制(IDC)技术:从SiP集成到车门模块的工程实践
  • 博主实测爆火的 Sakana Fugu,发现它还不如一个GPT?
  • 学习者高效阅读赋能知识吸收的方法与实践探究
  • 如何拯救你收藏的B站视频?m4s-converter让你的缓存文件重获新生
  • BilldDesk:完全免费的跨平台远程桌面控制软件完全指南
  • ROS嵌入式部署实战:在Jetson/RPi上稳定运行机器人系统
  • 服装贴口袋工序自动化科普:慧拿线上激光模板机全面解析
  • AI案例:选AI还是选人
  • 清理隐形账单刺客:基于 Python 的闲置云端资源自动巡检与审计实践
  • 白领 16 亿 tokens
  • 自监督学习实战:绕过标注瓶颈的工业AI落地路径
  • 面试官皱眉:“你的 Agent 跑了10轮之后还靠谱吗”,我说:“靠谱啊,为啥不靠谱?”,面试官让我回去再想想。。。
  • KPI测量不是算数,而是定义可验证的业务动作
  • Headunit Revived:让安卓设备变身 Android Auto 接收器,多连接方式及更新计划来袭!
  • Fastjson反序列化漏洞:从原理到实战防护的Java安全必修课
  • 从高维数据中提取本质特征:秩提取与鲁棒子空间设计实践