0. 前言
今天在执行一段脚本的时候,爆出错误:
Package opencv was not found in the pkg-config search path. Perhaps you should add the directory containing `opencv.pc' to the PKG_CONFIG_PATH environment variable
意思是在 PKG_CONFIG_PATH 环境变量中没有找到 opencv 的配置文件 ‘opencv.pc’,即 opencv 不在 pkg-config 的搜索路径,那什么是 pkg-config?什么是 PKG_CONFIG_PATH?
1. pkg-config
一般我们写的程序都是要依赖一些库,如 opencv,但库的安装位置可能不同,这时就需要一个工具能够管理并能搜索这些库的路径(头文件路径 /include,库文件路径 /lib)。
pkg-config 就是通过库提供的一个 .pc 文件获得库的各种必要信息的,包括版本信息、编译和连接需要的参数等。通过 pkg-config 提供的参数(–cflags, –libs),将所需信息提取出来供编译和连接使用。这样,不管库文件安装在哪,通过库对应的.pc文件就可以准确定位,。
它提供的主要功能有:
<1> 检查库的版本号。如果所需库的版本不满足要求,打印出错误信息,避免连接错误版本的库文件。
<2> 获得编译预处理参数,如宏定义,头文件的路径。
<3> 获得编译参数,如库及其依赖的其他库的位置,文件名及其他一些连接参数。
<4> 自动加入所依赖的其他库的设置。
2. PKG_CONFIG_PATH
pkg-config 默认会搜索 /usr/lib/pkgconfig
和/usr/share/pkgconfig
下的 .pc
配置文件,若我们源码编译的库的路径不在 pkg-config 的搜索路径下,则可以通过环境变量 PKG_CONFIG_PATH 将自定义的路径添加到 pkg-config 的搜索路径。
export PKG_CONFIG_PATH=/your/path:$PKG_CONFIG_PATH
3. 举例:opencv库
我们有时候需要源码编译高版本的 opencv 库,但又不想安装到默认路径下,这样可能可能会覆盖默认安装的 opencv,则需要将自定义安装路径。默认的 CMAKE_INSTALL_PREFIX
为 /usr/local
,通过以下参数来自定义安装路径。
cmake -D CMAKE_INSTALL_PREFIX=/home/username/local ..
将自定义的路径添加到 PKG_CONFIG_PATH 环境变量。通过下面命令,将自定义的 opencv 路径放在搜索路径的最前面,即先搜索这个路径。
export PKG_CONFIG_PATH=/home/username/local:$PKG_CONFIG_PATH
如何验证编译别的库的时候找到的是我们编译的OpenCV而不是系统的呢?可以通过pkg-config
命令来确定:
pkg-config --modversion opencv
在用 gcc/g++ 编译源码的时候,若依赖了 opencv,则需要添加 `pkg-config opencv --cflags --libs`
g++ -o abc abc.cpp `pkg-config opencv --cflags --libs`