使用pkg-config升级和切换glib库

前几天有人问我如何升级glib库,并在各个版本之间切换。本想用rpm安装的,结果发现glib安装包不支持修改安装目录,如下图。

如此,只能在编译源码时指定安装路径了。其实,我这是为了演示升级才安装glib库,我本身不需要它,所以不要问我如何使用glib提供的功能~

首先下载了glib2.4,解压后看看glib提供了哪些配置选项(都说只是演示库的升级,我并不想完整安装glib),如下图:

[[email protected] glib-2.4.0]# ./configure -help
`configure' configures glib 2.4.0 to adapt to many kinds of systems.

Usage: ./configure [OPTION]... [VAR=VALUE]...

To assign environment variables (e.g., CC, CFLAGS...), specify them as
VAR=VALUE.  See below for descriptions of some of the useful variables.

Defaults for the options are specified in brackets.

Configuration:
  -h, --help              display this help and exit
      --help=short        display options specific to this package
      --help=recursive    display the short help of all the included packages
  -V, --version           display version information and exit
  -q, --quiet, --silent   do not print `checking...' messages
      --cache-file=FILE   cache test results in FILE [disabled]
  -C, --config-cache      alias for `--cache-file=config.cache'
  -n, --no-create         do not create output files
      --srcdir=DIR        find the sources in DIR [configure dir or `..']

Installation directories:
  --prefix=PREFIX         install architecture-independent files in PREFIX
			  [/usr/local]
  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX
			  [PREFIX]

By default, `make install' will install all the files in
`/usr/local/bin', `/usr/local/lib' etc.  You can specify
an installation prefix other than `/usr/local' using `--prefix',
for instance `--prefix=$HOME'.

For better control, use the options below.

Fine tuning of the installation directories:
  --bindir=DIR           user executables [EPREFIX/bin]
  --sbindir=DIR          system admin executables [EPREFIX/sbin]
  --libexecdir=DIR       program executables [EPREFIX/libexec]
  --datadir=DIR          read-only architecture-independent data [PREFIX/share]
  --sysconfdir=DIR       read-only single-machine data [PREFIX/etc]
  --sharedstatedir=DIR   modifiable architecture-independent data [PREFIX/com]
  --localstatedir=DIR    modifiable single-machine data [PREFIX/var]
  --libdir=DIR           object code libraries [EPREFIX/lib]
  --includedir=DIR       C header files [PREFIX/include]
  --oldincludedir=DIR    C header files for non-gcc [/usr/include]
  --infodir=DIR          info documentation [PREFIX/info]
  --mandir=DIR           man documentation [PREFIX/man]

Program names:
  --program-prefix=PREFIX            prepend PREFIX to installed program names
  --program-suffix=SUFFIX            append SUFFIX to installed program names
  --program-transform-name=PROGRAM   run sed PROGRAM on installed program names

System types:
  --build=BUILD     configure for building on BUILD [guessed]
  --host=HOST       cross-compile to build programs to run on HOST [BUILD]

Optional Features:
  --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
  --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
  --enable-maintainer-mode enable make rules and dependencies not useful
                          (and sometimes confusing) to the casual installer
  --enable-debug=[no/minimum/yes]
                          turn on debugging [default=minimum]
  --enable-gc-friendly    turn on garbage collector friendliness [default=no]
  --disable-mem-pools     disable all glib memory pools
  --enable-ansi           turn on strict ansi [default=no]
  --enable-threads        turn on basic thread support [default=yes] ([=no]
                          will override --with-threads)
  --disable-rebuilds      disable all source autogeneration rules
  --disable-dependency-tracking Speeds up one-time builds
  --enable-dependency-tracking  Do not reject slow dependency extractors
  --disable-largefile     omit support for large files
  --enable-static[=PKGS]
                          build static libraries [default=no]
  --enable-shared[=PKGS]
                          build shared libraries [default=yes]
  --enable-fast-install[=PKGS]
                          optimize for fast installation [default=yes]
  --disable-libtool-lock  avoid locking (might break parallel builds)
  --enable-included-printf
                          use included printf [default=auto]
  --enable-gtk-doc        use gtk-doc to build documentation default=no
  --enable-man            regenerate man pages from Docbook [default=no]

Optional Packages:
  --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
  --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)
  --with-libiconv=[no/gnu/native]
                          use the libiconv library
  --with-gnu-ld           assume the C compiler uses GNU ld [default=no]
  --with-pic              try to use only PIC/non-PIC objects [default=use
                          both]
  --with-tags[=TAGS]
                          include additional configurations [automatic]
  --with-threads=[none/posix/dce/solaris/win32]
                          specify a thread implementation to use
  --with-html-dir=PATH    path to installed docs
  --with-xml-catalog=CATALOG
                          path to xml catalog to use

Some influential environment variables:
  CC          C compiler command
  CFLAGS      C compiler flags
  LDFLAGS     linker flags, e.g. -L<lib dir> if you have libraries in a
              nonstandard directory <lib dir>
  CPPFLAGS    C/C++ preprocessor flags, e.g. -I<include dir> if you have
              headers in a nonstandard directory <include dir>
  CXX         C++ compiler command
  CXXFLAGS    C++ compiler flags
  CPP         C preprocessor
  CXXCPP      C++ preprocessor
  F77         Fortran 77 compiler command
  FFLAGS      Fortran 77 compiler flags

Use these variables to override the choices made by `configure' or to help
it to find libraries and programs with nonstandard names/locations.

Report bugs to <http://bugzilla.gnome.org/enter_bug.cgi?product=glib>.

通过这个列表,可以选择性的编译glib的源码,以及设置编译参数,我的设置如下:生成静态库,不优化,生成映射文件

./configure --prefix=/root/glib2.4 --enable-debug=yes --enable-static CFLAGS="-g3 -O0" LDFLAGS="-Wl,-Map,Sym.map"

由于运气好,make 和make install过程没有出错,于是glib2.4 done

同样的办法用在glib2.10上,最终,我的电脑上有了两个版本的glib库:

安装库的目的是为了在工程中使用它提供的功能,因此此处写了一个测试程序test.c及Makefile:

test.c:

#include <glib.h>
#include <stdio.h>
int main()
{
	printf("version:%d %d %d\n",GLIB_MAJOR_VERSION,GLIB_MINOR_VERSION, GLIB_MICRO_VERSION);
	return 0;
}

Makefile:

TARGET=test
OBJS=test.o
all:$(OBJS)
	gcc -g3 -O0 -o $(TARGET) `pkg-config --libs glib-2.0` $(OBJS)
%.o:%.c
	gcc -g3 -O0 -c `pkg-config --cflags glib-2.0` $<

Makefile中使用了pkg-config工具来管理库版本,做到自由切换库的目的。这里从网上摘抄一段对pkg-config的描述:

"pkg-config要求库提供一个.pc元数据文件,从这些文件中检索库的各种必要信息,包括版本信息,编译

和连接需要的参数等。这些信息可以通过pkg-config提供的参数(如--cflags, --libs)单独提取出来直接

供编译器和连接器使用。

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

下。

环境变量PKG_CONFIG_PATH是用来设置.pc文件的搜索路径的,pkg-config按照设置路径的先后顺序进行

搜索。这样,库的头文件的搜索路径的设置实际上就变成了对.pc文件搜索路径的设置。"

...

"一般来说,即使是使用同一个库,不同的用户在安装时也可能会安装在不同的目录下。这样在编译时使用

-I参数指定include路径,在连接时使用-L参数指定lib库的路径,可能造成了编译,连接的不一致,同一

份程序从一台机器copy到另一台机器时就可能会出现问题。

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

它 的基本思想:事先把库的各种必要信息保存在.pc文件中,需要的时候可以使用参数(--cflags,

--libs),将所需信息提取出来供编译和连接使用。这样,不管库文件安装在哪,通过库对应的.pc文件就

可以准确定位,可以使用相同的编译和连接命 令,使得编译和连接界面统一。

它提供的主要功能有:

<1> 检查库的版本号。如果所需库的版本不满足要求,打印出错误信息,避免连接错误版本的库文件。

<2> 获得编译预处理参数,如宏定义,头文件的路径。

<3> 获得编译参数,如库及其依赖的其他库的位置,文件名及其他一些连接参数。

<4> 自动加入所依赖的其他库的设置。"

这大段话提到了.pc文件,提供了编译连接的参数,那来看看我安装的两个版本的glib库的.pc文件:

左边是低版本2.4右边是高版本2.10。

最后来看下如何在编译时实现两个版本之间切换:

通过设置export PKG_CONFIG_PATH=path to .pc设置.pc文件的搜索路径并使用其中的编译连接参数。

如test使用2.4的库,则设置为:

export PKG_CONFIG_PATH=/root/glib2.4/lib/pkgconfig/

使用2.10的库,则设置为:

export PKG_CONFIG_PATH=/root/glib2.0/lib/pkgconfig/

最终的运行结果为:

不同的搜索路径,得到不同的版本信息,这足以说明测试程序正确的连接了指定的glib版本。感觉这像是编译连接时的多态~

时间: 2024-10-11 17:26:19

使用pkg-config升级和切换glib库的相关文章

基于FS4412嵌入式系统移植(6) glib库的交叉编译与移植

今天和大家分享一下glib库的交叉编译过程和如何对程序进行编译以及运行. glib库的移植资料比较少,比较零散,这里我就写一下亲自移植的过程,和大家分享一下.按照我的过程移植应该是不会有问题,如果遇到了问题可以留言联系我,一起讨论研究. 这里需要强调一下:libc.glibc.glib是不同的库! glibc和 libc 都是 Linux 下的 C 函数库,而glib是GTK+的基础库 libc 是 Linux 下的 ANSI C 函数库:glibc 是 Linux 下的 GUN C 函数库.

malloc和free的内存到底有多大?——GNU glib库

大家应该都比较熟悉这一点:malloc分配的内存一定大于用户指定的大小!而且很多人也问过这样的问题:到底大多少?以及实际上malloc到底分配了多少? 我们知道这个大小一定在某个"神奇"地方记录着,但是就像自己的"思维"一样,你确无法感知!不过,这是错觉,只是我们习惯了只使用,而没有深入剖析源码,在这里我将揭开这个面纱,去掉其透明化! 声明:源码基于GNU glib库的2.7版本的malloc目录下相关文件 再声明:不同的C库实现方式不一定一样,这里是glib库,如

升级_开阔视野之Oracle图形化升级(dbca建库后升级)—10.2.0.1.0升为10.2.0.5.0

***********************************************声明***********************************************************************  原创作品,出自 "深蓝的blog" 博客,欢迎转载,转载时请务必注明出处,否则追究版权法律责任. 表述有错误之处,请您留言或邮件([email protected])指明,不胜感激. 本文转载必须保留此处:http://blog.csdn.net

Linux/CentOS 升级C基本运行库CLIBC的注意事项(当想解决GLIBC_2.x找不到的编译问题)

在你准备升级GLIBC库之前,你要好好思考一下, 你真的要升级GLIBC么? 你知道你自己在做什么么? http://baike.baidu.com/view/1323132.htm?fr=aladdin glibc是gnu发布的libc库,即c运行库.glibc是linux系统中最底层的api,几乎其它任何运行库都会依赖于glibc.glibc除了封装linux操作系统所提供的系统服务外,它本身也提供了许多其它一些必要功能服务的实现... 总的来说,不说运行在linux上的一些应用,或者你之前

java-第五章-do{}while()升级菜单切换

最近发现MDT推出去的系统的有不同问题,其问题就不说了,主要是策略权限被域继承了.比如我们手动安装的很多东东都是未配置壮态,推的就默认为安全壮态了,今天细找了一下,原来把这个关了就可以了. java-第五章-do{}while()升级菜单切换

系列篇|编译可在Android上运行的依赖库(一):glib库

前言 这是系列文章,它们由<编译可在Android上运行的glib库>及其他4篇文章组成,这4篇文章在“编译依赖库”一节中列出.由于glib库依赖于其他第三方库,所以需要先将依赖的第三方库交叉编译到Android平台上才能成功的编译glib库,系列文章中除<编译可在Android上运行的glib库>外的其他交叉编译文章均是介绍如何对glib依赖库进行交叉编译.以上,所以叫系列文章,因为这些文章完整的介绍了如何编译可在Android上运行的glib库. 文章价值 这些文章的核心价值是

glib库双向链表GList介绍

在上一篇文章里我介绍了glib库中单向链表的用法,这篇文章介绍glib库双向链表的用法,还是沿用上一篇文章的风格,采用在代码中加入注释来说明代码,最后贴出程序的运行结果,然后加以少量说明. 双向链表与单向链表的区别是,从一个节点,不仅能访问到它的下一个节点,还能访问到它的上一个节点,其定义如下: struct GList{ gpointer data;   GList *next;   GList *prev;}; 在这里可以看到双向链表比单向链表多了一个指向上一个节点的指针prev.下面给出一

GLib库安装与简析

GLib是GTK+和GNOME工程的基础底层核心程序库,是一个综合用途的实用的轻量级的C程序库, 它提供C语言的常用的数据结构的定义.相关的处理函数,有趣而实用的宏, 可移植的封装和一些运行时机能,如事件循环.线程.动态调用.对象系统等的API. 它能够在类UNIX的操作系统平台(如LINUX, HP-UNIX等),WINDOWS,OS2和BeOS等操作系统台上运行. 一.GLib在CentOS上的安装 检查系统当前的版本 # rpm -qi glibc Name        : glibc

MySQL一主二从复制环境切换主从库

假设有一个一主二从的环境,当主库M出现故障时,需要将其中一个从库S1切换为主库,同时将S2指向新的主库S1,如果可能,需要将故障的主库M修复并重置为新的从库. 搭建一主二从复制环境可参考:mysql5.7主从复制配置——读写分离实现. 1.环境信息:Mater:130.168.0.25Slave1:130.168.0.13Slave2:130.168.0.27 2.配置MySQL一主二从2.1.查询master(主服务器)的状态show master status; 2.2.配置slave1(从