pkg-config使用

 我们在用第三方库的时候,经常会用到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`




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值