pkg-config 详解

pkgconfig有什么用?
        大家应该都知道用第三方库,就少不了要使用到第三方的头文件和库文件。我们在编译、链接C++程序的时候,必须要指定这些头文件和库文件的位置。

        对于一个比较大第三方库,其头文件和库文件的数量是比较多的。如果我们一个个手动地写,那将是相当麻烦的。所以,pkg-config就应运而生了。pkg-config是一个linux下的命令,她能够把这些头文件和库文件的位置指出来,给编译器使用。

举一个例子:$ gcc main.c `pkg-config --cflags --libs gtk+-2.0` -o main

        上面的编译命令中,`pkg-config --cflags --libs gtk+-2.0`的作用就如前面所说的,把gtk的头文件路径和库文件列出来,让编译去获取。--cflags和--libs分别指定头文件和库文件。这样,我们的程序main.c里引用pkg-config库,在编译时就不会手工通过-I、-L等参数去手工指定头文件、库文件的位置了。

pkg-config的信息从哪里来?

pkg-config命令是通过查询XXX.pc文件而知道对应库的这些信息。pkg-config又是如何找到所需的.pc文件呢?有两种路径: 

  • 取系统的/usr/lib下的所有*.pc文件。 
  • PKG_CONFIG_PATH环境变量所指向的路径下的所有*.pc文件。

1)这些pc文件什么时候有的?

在安装某个库/模块的时候,自动添加的。比如你往系统安装opencv时,就会在/usr/lib/目录下,放一个opencv.pc。 

2)pkg-config如何找到对应的pc文件?

在使用pkg-config命令的时候去指定。比如$ gcc main.c `pkg-config --cflags --libs gtk+-2.0` -o main 就指定了要查找的.pc文件是gtk+-2.0.pc。

pkg-config命令参数

所有的参数可以通过pkg-config –help来查看。主要有用的有:

  • --cflags:查看头文件信息;
  • --libs:查看库信息;
  • --list-all:模块的所有信息;

pc文件规范

  • Name: 该模块的名字,比如你的pc名字是xxxx.pc,那么名字最好也是xxxx。 
  • Description: 模块的简单描述。上文pkg-config –list-all命令出来的结果,每个名字后面就是description。 
  • URL: 用户可以通过该URL获得更多信息,或者下载信息。也是辅助的,可要可不要。 
  • Version: 版本号。 
  • Requires: 该模块有木有依赖于其他模块。一般没有。 
  • Requires.private: 该模块有木有依赖于其他模块,并且还不需要第三方知道的。一般也没有。 
  • Conflicts: 有没有和别的模块冲突。常用于版本冲突。比如,Conflicts: bar < 1.2.3,表示和bar模块的1.2.3以下的版本有冲突。 
  • Cflags: 这个就很重要了。pkg-config的参数–cflags就指向这里。主要用于写本模块的头文件的路径。 
  • Libs: 也很重要,pkg-config的参数–libs就指向这里。主要用于写本模块的库/依赖库的路径。 
  • Libs.private: 本模块依赖的库,但不需要第三方知道。

例如:


Name: opencv
Description:OpenCV pc file
Version: 2.4
Cflags:-I/usr/local/include
Libs:-L/usr/local/lib –lxxx –lxxx

 

 

 

 

你可能感兴趣的:(C++)