pkg-config

1 pkg-config介绍

pkg-config用来检索系统中安装库文件的信息。典型的是用作库的编译和连接。如在Makefile中:


program: program.c

cc program.c `pkg-config --cflags --libs gnomeui`

pkg-config --list-all    可以列出所有可使用的包。

pkg-config要求库提供一个.pc元数据文件,从这些文件中检索库的各种必要信息,包括版本信息,编译和连接需要的参数等。这些信息可以通过pkg-config提供的参数(如--cflags, --libs)单独提取出来直接供编译器和连接器使用。

默认情况下,每个支持pkg-config的库对应的.pc文件,在安装后,都位于目录/usr/lib/pkgconfig目录下。

环境变量PKG_CONFIG_PATH是用来设置.pc文件的搜索路径的,pkg-config按照设置路径的先后顺序进行搜索。这样,库的头文件的搜索路径的设置实际上就变成了对.pc文件搜索路径的设置。

2 pkg-config功能

一般来说,即使是使用同一个库,不同的用户在安装时也可能会安装在不同的目录下。这样在编译时使用-I参数指定include路径,在连接时使用-L参数指定lib库的路径,可能造成了编译,连接的不一致,同一份程序从一台机器copy到另一台机器时就可能会出现问题。

pkg-config就是用来解决编译连接界面不统一问题的一个工具。

它的基本思想:事先把库的各种必要信息保存在.pc文件中,需要的时候可以使用参数(--cflags, --libs),将所需信息提取出来供编译和连接使用。这样,不管库文件安装在哪,通过库对应的.pc文件就可以准确定位,可以使用相同的编译和连接命令,使得编译和连接界面统一。

它提供的主要功能有:
<1> 检查库的版本号。如果所需库的版本不满足要求,打印出错误信息,避免连接错误版本的库文件。
<2> 获得编译预处理参数,如宏定义,头文件的路径。
<3> 获得编译参数,如库及其依赖的其他库的位置,文件名及其他一些连接参数。
<4> 自动加入所依赖的其他库的设置。

3 gtk+-2.0的.pc文件内容举例


prefix=/usr

exec_prefix=/usr

libdir=/usr/lib

includedir=/usr/include

target=x11

gtk_binary_version=2.4.0

gtk_host=i386-redhat-linux-gnu

Name: GTK+

Description: GIMP Tool Kit (${target} target)

Version: 2.6.7

Requires: gdk-${target}-2.0 atk

Libs: -L${libdir} -lgtk-${target}-2.0

Cflags: -I${includedir}/gtk-2.0

如果要使用gtk+的库编译一个程序,可以如下:


$gcc -c program.c -o program `pkg-config "gtk+-2.0>2.0.0" --cflags --libs`

其中,--cflags参数提取出编译所需的选项,--libs参数提取出连接时的选项。上面一步也可以分成两步如下:


$gcc -c program.c `pkg-config --cflags "gtk+-2.0>2.0.0"`

$gcc -o program program.o `pkg-config --libs "gtk+-2.0>2.0.0"`

4 环境变量PKG_CONFIG_PATH

在安装完一个需要使用的库后,比如Glib,一是将相应的.pc文件,如glib-2.0.pc拷贝到/usr/lib/pkgconfig目录下,二是通过设置环境变量PKG_CONFIG_PATH添加glib-2.0.pc文件的搜索路径。

尤其是不完全使用新安装的库取代旧库的时候,使用环境变量可能是更好的选择,因为环境窗口的设置只对当前终端窗口有效。

使用环境变量的方法,只需修改PKG_CONFIG_PATH和LD_LIBRARY_PATH变量。LD_LIBRARY_PATH变量主要是添加新安装库的搜索路径。

如新的Glib库安装在/usr/local/glib-2.0/lib下,可以编辑文件set_glib-2.0:


export PKG_CONFIG_PATH=/usr/local/lib/glib-2.0/lib/pkgconfig:$PKG_CONFIG_PATH

export LD_LIBRARY_PATH=/usr/local/lib/glib-2.0/lib:$LD_LIBRARY_PATH

每次使用时,source下就行了:


$source set_glib-2.0

5 其他的config


$ls /usr/bin/*config

时间: 2024-11-01 17:47:37

pkg-config的相关文章

GCC 命令行详解 -L 指定库的路径 -l 指定需连接的库名

为什么会出现undefined reference to 'xxxxx'错误?首先这是链接错误,不是编译错误,也就是说如果只有这个错误,说明你的程序源码本身没有问题,是你用编译器编译时参数用得不对,没有指定链接程序要用到得库,比如你的程序里用到了一些数学函数,那么你就要在编译参数里指定程序要链接数学库,方法是在编译命令行里加入-lm. -l参数和-L参数-l参数就是用来指定程序要链接的库,-l参数紧接着就是库名,那么库名跟真正的库文件名有什么关系呢?就拿数学库来说,他的库名是m,他的库文件名是l

Centos7下安装部署MXNET

Centos下安装MXNET(类似于Amazon Linux下安装MXNET),参考官方文档http://mxnet.io/get_started/setup.html#prerequisites, 安装步骤如下: ###################################################################### # This script installs MXNet for Python along with all required depende

ffmpeg2.2.3编译安装

参考文档:http://blog.chinaunix.net/uid-23069658-id-4018842.html 下载所需解码器: lame:wget http://nchc.dl.sourceforge.net/project/lame/lame/3.99/lame-3.99.5.tar.gz libogg:wget http://downloads.xiph.org/releases/ogg/libogg-1.3.2.tar.gz libvorbis:wget http://downl

《软件调试的艺术》学习笔记——GDB使用技巧摘要

<软件调试的艺术>学习笔记——GDB使用技巧摘要 <软件调试的艺术>,因为名是The Art of Debugging with GDB, DDD, and Eclipse. 作者是美国的Norman Matloff和Peter Jay Salzman,中文版由张云翻译.是人邮出版社图灵程序设计丛书初版.这里称为"艺术",个人觉得有点过了,但是其中关于gdb以及在gdb基础之上集成的DDD和Eclipse调试技巧的整理确实是做的很好,对于Linux/开源社区下的

移植tslib和Qt5.6到三星s5pv210开发板

tslib1.4移植 下载tslib1.4后 1.cp tslib-1.4.tar.bz2 /home/gec 2.tar jxvf tslib-1.4.tar.bz2 3.sudo -s 4.cd tslib-1.4/ 5../configure --host=arm-linux --prefix=/usr/local/arm ac_cv_func_malloc_0_nonnull=yes 6.make 7.make install 修改tslib安装目录下的/etc/ts.conf文件去掉#

cisco asa config guid

因工作需要,对CISCO ASA5505进行简单的配置,参考网上的文章总结了部分简单的功能配置方法,主要是PAT,WEB SSL VPN的配置,还有简单的访问控制列表. -----  1. 设备命名-------- ciscoasa> enable ciscoasa# configure terminal ciscoasa(config)# hostname ASA5505 -----  2. 添加enable密码   ---------- ASA5505(config)# password x

MPC8313ERDB不新建pkg包,把文件放进Ramdisk

通过ltib编译生成的rootfs.ext2.gz.uboot可以直接在uboot使用,如果我们在外部编译生成了相应的文件要放到Ramdisk里面去,可以新建一个pkg包,然后再配置编译生成(这个我没有试过,,,),当然这种方法比较的麻烦,那么有一个更简单的方法,不需要新建一个pkg就可以直接把文件放进Ramdisk里面去. 要把文件放进去有两种方法: 1. 在ltib的安装目录新一个名为merge的文件夹,然后把你需要放进去的文件放到该文件夹,系统在生成Ramdisk的时候,会把merge里面

MPC8313ERDB不新鲜pkg包裹,把文件放进Ramdisk

经ltib编译器生成rootfs.ext2.gz.uboot它可以直接uboot采用.假设我们编写了相应的外部文件把Ramdisk往里走.您可以创建一个pkg包裹.然后配置编译(,.,).当然这样的方法比較的麻烦.那么有一个更简单的方法,不须要新建一个pkg就能够直接把文件放进Ramdisk里面去. 要把文件放进去有两种方法: 1. 在ltib的安装文件夹新一个名为merge的文件夹.然后把你须要放进去的文件放到该文件夹,系统在生成Ramdisk的时候,会把merge里面的全部内容复制到Ramd

uboot顶层config.mk分析

## (C) Copyright 2000-2006# Wolfgang Denk, DENX Software Engineering, [email protected]## See file CREDITS for list of people who contributed to this# project.## This program is free software; you can redistribute it and/or# modify it under the terms

golang之pkg(包)

一.概述 Golang拥有超过100个标准包(可用go list std |wc -l查看) 任何包系统设计的目的都是简化大型程序的设计和维护工作,通过将一组相关的特性放进一个独立的模块以便于理解和更新,在每个模块更新的同时保持和程序中其他模块的相对独立,这种模块化的特性允许每个包能被其他的不同项目共享和重用,在项目范围内.全局范围内的复用: 每个包一般都定义了一个不同的名字空间用于它内部的每个标识符的访问. 每个名字空间关联到一个特定的包, 让我们给类型. 函数等选择简短明了的名字, 这样可以