您的位置:首页 > 其它

pkg-config使用

2014-08-15 16:42 253 查看

我们在用第三方库的时候,经常会用到pkg-config这个东西来编译程序。

pkg-config是干什么用的?简单的说就是向用户向程序提供相应库的路径、版本号等信息的程序。

典型的是用作库的编译和连接。如在Makefile中:

program: program.c

cc program.c `pkg-config --cflags --libs gnomeui`
譬如说我们运行以下命令:

pkg-config 查看gcc的CFLAGS参数

$pkg-config --libs --cflags opencv

会显示如下信息:

-I/usr/local/include/opencv -L/usr/local/lib -lcxcore -lcv -lhighgui -lcvaux -lml

各位看官,你看这不就是我们用gcc编译连接时CFLAGS的参数吗?

因此当我们需要编译连接某个库时,我们只需要把上面那行加入gcc 的参数里面即可。

这也是configure的作用,它会检查你需要的包,产生相应的信息。

那pkg-config从哪儿知道这些信息的呢?它是从包名为xxx.pc这个文件中查找到的。拿上面那个例子说,它是从opencv.pc这个文件中查知的。

那pkg-config 又怎么会知道opencv.pc这个文件呢?

下面我们看一下pkg-config是怎样工作的。

缺省情况下,pkg-config首 先在prefix/lib/pkgconfig/中查找相关包(譬如opencv)对应的相应的文件(opencv.pc)。在linux上上述路径名为
/usr/lib/pkconfig/。若是没有找到,它也会到PKG_CONFIG_PATH这个环境变量所指定的路径下去找。


设置环境变量PKG_CONFIG_PATH方法举例如下:

export PKG_CONFIG_PATH=/cv/lib:$PKG_CONFIG_PATH

================================================================

查看一个.pc文件的内容:

root@tfy:/usr/local/lib/pkgconfig# cat opencv.pc

# Package Information for pkg-config

prefix=/usr/local

exec_prefix=${prefix}

libdir=${exec_prefix}/lib

includedir=${prefix}/include/opencv

Name: OpenCV

Description: Intel(R) Open Source Computer Vision Library

Version: 2.0.0

Libs: -L${libdir} -lcxcore -lcv -lhighgui -lcvaux -lml

Cflags: -I${includedir}

[root@yx pkgconfig]# pwd

/usr/lib/pkgconfig

可见.pc文件 是对其的库文件路径,头文件路径,版本号,Cflags等一些参数进行封装。

如何进行编译程序:

例 DispalyImage.cpp

root@tfy:/home/tfy/code/opencv/test# cat DisplayImage.cpp

#include <stdio.h>

#include <opencv2/opencv.hpp>

using namespace cv;

int main(int argc, char** argv )

{

if ( argc != 2 )

{

printf("usage: DisplayImage.out <Image_Path>\n");

return -1;

}

Mat image;

image = imread( argv[1], 1 );

if ( !image.data )

{

printf("No image data \n");

return -1;

}

namedWindow("Display Image", CV_WINDOW_AUTOSIZE );

imshow("Display Image", image);

waitKey(0);

return 0;

}

g++ -ggdb `pkg-config --cflags opencv` `pkg-config --libs opencv` -o
DisplayImage DisplayImage.cpp

其中,--cflags参数提取出编译所需的选项,--libs参数提取出连接时的选项,可以分为两步:

$g++ -c
DisplayImage.cpp`pkg-config --cflags opencv`

$g++ -o
DisplayImage DisplayImage.o`pkg-config --libs opencv`
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: