linux / pkg-config 原理及用法

pkg-config是一个方便管理第三方库头文件和库文件位置的工具,通过读取.pc文件来简化编译链接过程。设置PKG_CONFIG_PATH环境变量可以指示pkg-config查找自定义库的.pc文件。编写pc文件时,需要包含Name、Description、Version、Cflags和Libs等关键信息,以便pkg-config正确引用库。

一、pkgconfig 有什么用

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

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

pkg-config --cflags uuid

结果

-I/usr/include/uuid

可以看到其输出是 uuid 的头文件的路径。

我们平常都是这样用 pkg-config 的。

gcc main.c `pkg-config --cflags --libs uuid` -o main

上面的编译命令中,`pkg-config --cflags --libs uuid` 的作用就如前面所说的,把 uuid 的头文件路径和库文件列出来,让编译去获取。--cflags 和 --libs 分别指定头文件和库文件。

二、配置环境变量

看到这里,大家可能想试一下将 pkg-config 用于自己的库。下面就说一下,怎么写。

首先要明确一点,因为 pkg-config 也只是一个命令,所以不是你安装了一个第三方的库,pkg-config 就能知道第三方库的头文件和库文件所在的位置。pkg-config 命令是通过查询 XXX.pc 文件而知道这些的。我们所需要做的是,写一个属于自己的库的 .pc 文件。

但 pkg-config 又是如何找到所需的 .pc 文件呢?这就需要用到一个环境变量 PKG_CONFIG_PATH 了。这环境变量写明 .pc 文件的路径,pkg-config 命令会读取这个环境变量的内容,这样就知道 pc 文件了。

对于 Ubuntu 系统,可以用 root 权限打开 /etc/bash.bashrc 文件。在最后输入下面的内容。

        

这样,pkg-config 就会去 /usr/local/lib/pkgconfig 目录下,寻找 .pc 文件了。如果不是 Ubuntu 系统,那就没有 /etc/bash.bashrc 文件,可以参考我的一篇博文,来找到一个合适的文件,修改这个环境变量。输入bash命令使得配置生效。

三、pc 文件书写规范

好了,现在我们开始写自己的 .pc 文件。只需写 5 个内容即可:Name、Description、Version、Cflags、Libs。

        比如简单的:

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

其中 Name 对应的内容要和这个 pc 文件的文件名一致。当然为了书写方便还会加入一些变量,比如前缀变量 prefix 。下面有一个更完整的 pc 文件的内容       

其中,Cflags 和 Libs 的写法,是使用了-I -L -l 这些 gcc 的编译选项。

转载:pkg-config原理及用法 - stardsd - 博客园

(SAW:Game Over!)

 

 

分析如下报错原因 . /home/lgb/sharedfile/ipc/platform/nvmp/include/shell.sh; gzip -dc /home/lgb/sharedfile/ipc/platform/nvmp/dl/pkg-config-0.29.1.tar.gz | /bin/tar -C /home/lgb/sharedfile/ipc/platform/nvmp/build_dir/host/pkg-config-0.29.1/.. -xf - touch /home/lgb/sharedfile/ipc/platform/nvmp/build_dir/host/pkg-config-0.29.1/.preparedfbd9a6a7cd6e01f894e63b3e219fe612 (cd /home/lgb/sharedfile/ipc/platform/nvmp/build_dir/host/pkg-config-0.29.1/; if [ -x configure ]; then cp -fpR /home/lgb/sharedfile/ipc/platform/nvmp/scripts/config.{guess,sub} /home/lgb/sharedfile/ipc/platform/nvmp/build_dir/host/pkg-config-0.29.1// && ./configure --with-internal-glib --with-pc_path="/usr/local/lib/x86_64-linux-gnu/pkgconfig:/usr/local/lib/pkgconfig:/usr/local/share/pkgconfig:/usr/lib/x86_64-linux-gnu/pkgconfig:/usr/lib/pkgconfig:/usr/share/pkgconfig" --with-libiconv=gnu \ bash: -c: line 1: syntax error: unexpected end of file Makefile:52: recipe for target '/home/lgb/sharedfile/ipc/platform/nvmp/build_dir/host/pkg-config-0.29.1/.configured' failed make[3]: *** [/home/lgb/sharedfile/ipc/platform/nvmp/build_dir/host/pkg-config-0.29.1/.configured] Error 1 make[3]: Leaving directory '/home/lgb/sharedfile/ipc/platform/nvmp/tools/pkg-config' tools/Makefile:173: recipe for target 'tools/pkg-config/compile' failed make[2]: *** [tools/pkg-config/compile] Error 2 make[2]: Leaving directory '/home/lgb/sharedfile/ipc/platform/nvmp' tools/Makefile:156: recipe for target '/home/lgb/sharedfile/ipc/platform/nvmp/staging_dir/target-arm-ca9-linux-uclibcgnueabihf-cx50v1/stamp/.tools_install_nnnnn' failed make[1]: *** [/home/lgb/sharedfile/ipc/platform/nvmp/staging_dir/target-arm-ca9-linux-uclibcgnueabihf-cx50v1/stamp/.tools_install_nnnnn] Error 2 make[1]: Leaving directory '/home/lgb/sharedfile/ipc/platform/nvmp' /home/lgb/sharedfile/ipc/platform/nvmp/include/toplevel.mk:203: recipe for target 'world' failed make: *** [world] Error 2
最新发布
12-04
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值