pkg-config介绍
2026/6/25 13:47:06 网站建设 项目流程

接着前面的博客,此篇不聊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

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询