Linux的pkg-config命令

文章作者:Tyan
博客:noahsnail.com  |  CSDN  |  简书

1. pkg-config介绍

pkg-config是一个在源代码编译时查询已安装的库的使用接口的计算机工具软件。pkg-config原本是设计用于Linux的,但现在在各个版本的BSD、windows、Mac OS X和Solaris上都有着可用的版本。
它输出已安装的库的相关信息,包括:1. C/C++编译器需要的输入参数;2. 链接器需要的输入参数;3. 已安装软件包的版本信息。

当安装一个库时(例如从RPM,deb或其他二进制包管理系统),会包括一个后缀名为pc的文件,它会放入某个文件夹下(依赖于你的系统设置)。例如,在Linux为该软件的库文件所在文件夹lib之下的子文件夹pkgconfig。把该子文件夹加入pkg-config的环境变量PKG_CONFIG_PATH作为搜索路径,例如在bash配置文件中加入:

1
$ export PKG_CONFIG_PATH=/usr/local/库名字/lib/pkgconfig:$PKG_CONFIG_PATH

在这个.pc文件里包含有数个条目。这些条目通常包含用于其他使用这个库的程序编译时需要的库设置,以及头文件的位置,版本信息和一个简介。以OpenCV为例,在Mac上pkgconfig目录所在的路径为:/usr/local/Cellar/opencv3/3.1.0_4/lib/pkgconfig/,目录下的.pc文件为opencv.pc,其内容为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# Package Information for pkg-config

prefix=/usr/local/Cellar/opencv3/3.1.0_4
exec_prefix=${prefix}
libdir=${exec_prefix}/lib
includedir_old=${prefix}/include/opencv
includedir_new=${prefix}/include

Name: OpenCV
Description: Open Source Computer Vision Library
Version: 3.1.0
Libs: -L${exec_prefix}/lib -lopencv_shape -lopencv_stitching -lopencv_objdetect -lopencv_superres -lopencv_videostab -lippicv -lopencv_calib3d -lopencv_features2d -lopencv_highgui -lopencv_videoio -lopencv_imgcodecs -lopencv_video -lopencv_photo -lopencv_ml -lopencv_imgproc -lopencv_flann -lopencv_core
Libs.private: -framework OpenCL -framework Cocoa -L/usr/local/opt/jpeg/lib -ljpeg -L/usr/local/lib -lwebp -lpng -ltiff -lImath -lIlmImf -lIex -lHalf -lIlmThread -L/usr/lib -lz -framework QTKit -framework QuartzCore -framework AppKit
Cflags: -I${includedir_old} -I${includedir_new}

2. pkg-config的使用

在Linux/Mac系统下编写C、C++程序时,编译时需要包含头文件,链接时需要库文件,但安装一些第三方库之后不知道对应的include文件和lib文件的位置,此时就需要pkg-config了。以opencv为例:

  • 查看头文件位置
1
2
3
4
5
# 命令形式:pkg-config --cflags software_name

# demo
$ pkg-config --cflags opencv
-I/usr/local/Cellar/opencv3/3.1.0_4/include/opencv -I/usr/local/Cellar/opencv3/3.1.0_4/include
  • 查看lib库的位置
1
2
3
4
5
# 命令形式:pkg-config --libs software_name

# demo
$ pkg-config --libs opencv
-L/usr/local/Cellar/opencv3/3.1.0_4/lib -lopencv_shape -lopencv_stitching -lopencv_objdetect -lopencv_superres -lopencv_videostab -lippicv -lopencv_calib3d -lopencv_features2d -lopencv_highgui -lopencv_videoio -lopencv_imgcodecs -lopencv_video -lopencv_photo -lopencv_ml -lopencv_imgproc -lopencv_flann -lopencv_core
  • 编译程序,编译DispalyImage.cpp文件

DispalyImage.cpp文件内容为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include<iostream>
#include<opencv2/opencv.hpp>
#include<opencv2/highgui.hpp>
#include<opencv2/core.hpp>
using namespace std;
using namespace cv;
int main()
{
Mat img = imread("./lena.bmp");
if(!img.data)
{
return -1;
}
namedWindow("Lena", CV_WINDOW_AUTOSIZE);
imshow("Lena", img);
waitKey();
return 0;
}

编译,链接生成可执行程序DisplayImage:

1
$ g++ -o DisplayImage $(pkg-config --cflags --libs opencv) DisplayImage.cpp

运行结果:

Lena

参考资料:

  1. https://zh.wikipedia.org/wiki/Pkg-config
如果有收获,可以请我喝杯咖啡!