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

2024-02-29 01:48

本文主要是介绍使用pkg-config升级和切换glib库,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

    

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

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

   

[cpp]  view plain  copy
  1. [root@localhost glib-2.4.0]# ./configure -help  
  2. `configure' configures glib 2.4.0 to adapt to many kinds of systems.  
  3.   
  4. Usage: ./configure [OPTION]... [VAR=VALUE]...  
  5.   
  6. To assign environment variables (e.g., CC, CFLAGS...), specify them as  
  7. VAR=VALUE.  See below for descriptions of some of the useful variables.  
  8.   
  9. Defaults for the options are specified in brackets.  
  10.   
  11. Configuration:  
  12.   -h, --help              display this help and exit  
  13.       --help=short        display options specific to this package  
  14.       --help=recursive    display the short help of all the included packages  
  15.   -V, --version           display version information and exit  
  16.   -q, --quiet, --silent   do not print `checking...' messages  
  17.       --cache-file=FILE   cache test results in FILE [disabled]  
  18.   -C, --config-cache      alias for `--cache-file=config.cache'  
  19.   -n, --no-create         do not create output files  
  20.       --srcdir=DIR        find the sources in DIR [configure dir or `..']  
  21.   
  22. Installation directories:  
  23.   --prefix=PREFIX         install architecture-independent files in PREFIX  
  24.               [/usr/local]  
  25.   --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX  
  26.               [PREFIX]  
  27.   
  28. By default, `make install' will install all the files in  
  29. `/usr/local/bin', `/usr/local/lib' etc.  You can specify  
  30. an installation prefix other than `/usr/local' using `--prefix',  
  31. for instance `--prefix=$HOME'.  
  32.   
  33. For better control, use the options below.  
  34.   
  35. Fine tuning of the installation directories:  
  36.   --bindir=DIR           user executables [EPREFIX/bin]  
  37.   --sbindir=DIR          system admin executables [EPREFIX/sbin]  
  38.   --libexecdir=DIR       program executables [EPREFIX/libexec]  
  39.   --datadir=DIR          read-only architecture-independent data [PREFIX/share]  
  40.   --sysconfdir=DIR       read-only single-machine data [PREFIX/etc]  
  41.   --sharedstatedir=DIR   modifiable architecture-independent data [PREFIX/com]  
  42.   --localstatedir=DIR    modifiable single-machine data [PREFIX/var]  
  43.   --libdir=DIR           object code libraries [EPREFIX/lib]  
  44.   --includedir=DIR       C header files [PREFIX/include]  
  45.   --oldincludedir=DIR    C header files for non-gcc [/usr/include]  
  46.   --infodir=DIR          info documentation [PREFIX/info]  
  47.   --mandir=DIR           man documentation [PREFIX/man]  
  48.   
  49. Program names:  
  50.   --program-prefix=PREFIX            prepend PREFIX to installed program names  
  51.   --program-suffix=SUFFIX            append SUFFIX to installed program names  
  52.   --program-transform-name=PROGRAM   run sed PROGRAM on installed program names  
  53.   
  54. System types:  
  55.   --build=BUILD     configure for building on BUILD [guessed]  
  56.   --host=HOST       cross-compile to build programs to run on HOST [BUILD]  
  57.   
  58. Optional Features:  
  59.   --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)  
  60.   --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]  
  61.   --enable-maintainer-mode enable make rules and dependencies not useful  
  62.                           (and sometimes confusing) to the casual installer  
  63.   --enable-debug=[no/minimum/yes]  
  64.                           turn on debugging [default=minimum]  
  65.   --enable-gc-friendly    turn on garbage collector friendliness [default=no]  
  66.   --disable-mem-pools     disable all glib memory pools  
  67.   --enable-ansi           turn on strict ansi [default=no]  
  68.   --enable-threads        turn on basic thread support [default=yes] ([=no]  
  69.                           will override --with-threads)  
  70.   --disable-rebuilds      disable all source autogeneration rules  
  71.   --disable-dependency-tracking Speeds up one-time builds  
  72.   --enable-dependency-tracking  Do not reject slow dependency extractors  
  73.   --disable-largefile     omit support for large files  
  74.   --enable-static[=PKGS]  
  75.                           build static libraries [default=no]  
  76.   --enable-shared[=PKGS]  
  77.                           build shared libraries [default=yes]  
  78.   --enable-fast-install[=PKGS]  
  79.                           optimize for fast installation [default=yes]  
  80.   --disable-libtool-lock  avoid locking (might break parallel builds)  
  81.   --enable-included-printf  
  82.                           use included printf [default=auto]  
  83.   --enable-gtk-doc        use gtk-doc to build documentation default=no  
  84.   --enable-man            regenerate man pages from Docbook [default=no]  
  85.   
  86. Optional Packages:  
  87.   --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]  
  88.   --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)  
  89.   --with-libiconv=[no/gnu/native]  
  90.                           use the libiconv library  
  91.   --with-gnu-ld           assume the C compiler uses GNU ld [default=no]  
  92.   --with-pic              try to use only PIC/non-PIC objects [default=use  
  93.                           both]  
  94.   --with-tags[=TAGS]  
  95.                           include additional configurations [automatic]  
  96.   --with-threads=[none/posix/dce/solaris/win32]  
  97.                           specify a thread implementation to use  
  98.   --with-html-dir=PATH    path to installed docs  
  99.   --with-xml-catalog=CATALOG  
  100.                           path to xml catalog to use  
  101.   
  102. Some influential environment variables:  
  103.   CC          C compiler command  
  104.   CFLAGS      C compiler flags  
  105.   LDFLAGS     linker flags, e.g. -L<lib dir> if you have libraries in a  
  106.               nonstandard directory <lib dir>  
  107.   CPPFLAGS    C/C++ preprocessor flags, e.g. -I<include dir> if you have  
  108.               headers in a nonstandard directory <include dir>  
  109.   CXX         C++ compiler command  
  110.   CXXFLAGS    C++ compiler flags  
  111.   CPP         C preprocessor  
  112.   CXXCPP      C++ preprocessor  
  113.   F77         Fortran 77 compiler command  
  114.   FFLAGS      Fortran 77 compiler flags  
  115.   
  116. Use these variables to override the choices made by `configure' or to help  
  117. it to find libraries and programs with nonstandard names/locations.  
  118.   
  119. Report bugs to <http://bugzilla.gnome.org/enter_bug.cgi?product=glib>.  
通过这个列表,可以选择性的编译glib的源码,以及设置编译参数,我的设置如下:生成静态库,不优化,生成映射文件

[cpp]  view plain  copy
  1. ./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:

[cpp]  view plain  copy
  1. #include <glib.h>  
  2. #include <stdio.h>  
  3. int main()  
  4. {  
  5.     printf("version:%d %d %d\n",GLIB_MAJOR_VERSION,GLIB_MINOR_VERSION, GLIB_MICRO_VERSION);  
  6.     return 0;  
  7. }  

Makefile:

[cpp]  view plain  copy
  1. TARGET=test  
  2. OBJS=test.o  
  3. all:$(OBJS)  
  4.     gcc -g3 -O0 -o $(TARGET) `pkg-config --libs glib-2.0` $(OBJS)  
  5. %.o:%.c  
  6.     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的库,则设置为:

[cpp]  view plain  copy
  1. export PKG_CONFIG_PATH=/root/glib2.4/lib/pkgconfig/  

使用2.10的库,则设置为:

[cpp]  view plain  copy
  1. export PKG_CONFIG_PATH=/root/glib2.0/lib/pkgconfig/  
最终的运行结果为:



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

这篇关于使用pkg-config升级和切换glib库的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/757223

相关文章

中文分词jieba库的使用与实景应用(一)

知识星球:https://articles.zsxq.com/id_fxvgc803qmr2.html 目录 一.定义: 精确模式(默认模式): 全模式: 搜索引擎模式: paddle 模式(基于深度学习的分词模式): 二 自定义词典 三.文本解析   调整词出现的频率 四. 关键词提取 A. 基于TF-IDF算法的关键词提取 B. 基于TextRank算法的关键词提取

使用SecondaryNameNode恢复NameNode的数据

1)需求: NameNode进程挂了并且存储的数据也丢失了,如何恢复NameNode 此种方式恢复的数据可能存在小部分数据的丢失。 2)故障模拟 (1)kill -9 NameNode进程 [lytfly@hadoop102 current]$ kill -9 19886 (2)删除NameNode存储的数据(/opt/module/hadoop-3.1.4/data/tmp/dfs/na

Hadoop数据压缩使用介绍

一、压缩原则 (1)运算密集型的Job,少用压缩 (2)IO密集型的Job,多用压缩 二、压缩算法比较 三、压缩位置选择 四、压缩参数配置 1)为了支持多种压缩/解压缩算法,Hadoop引入了编码/解码器 2)要在Hadoop中启用压缩,可以配置如下参数

Makefile简明使用教程

文章目录 规则makefile文件的基本语法:加在命令前的特殊符号:.PHONY伪目标: Makefilev1 直观写法v2 加上中间过程v3 伪目标v4 变量 make 选项-f-n-C Make 是一种流行的构建工具,常用于将源代码转换成可执行文件或者其他形式的输出文件(如库文件、文档等)。Make 可以自动化地执行编译、链接等一系列操作。 规则 makefile文件

使用opencv优化图片(画面变清晰)

文章目录 需求影响照片清晰度的因素 实现降噪测试代码 锐化空间锐化Unsharp Masking频率域锐化对比测试 对比度增强常用算法对比测试 需求 对图像进行优化,使其看起来更清晰,同时保持尺寸不变,通常涉及到图像处理技术如锐化、降噪、对比度增强等 影响照片清晰度的因素 影响照片清晰度的因素有很多,主要可以从以下几个方面来分析 1. 拍摄设备 相机传感器:相机传

pdfmake生成pdf的使用

实际项目中有时会有根据填写的表单数据或者其他格式的数据,将数据自动填充到pdf文件中根据固定模板生成pdf文件的需求 文章目录 利用pdfmake生成pdf文件1.下载安装pdfmake第三方包2.封装生成pdf文件的共用配置3.生成pdf文件的文件模板内容4.调用方法生成pdf 利用pdfmake生成pdf文件 1.下载安装pdfmake第三方包 npm i pdfma

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

git使用的说明总结

Git使用说明 下载安装(下载地址) macOS: Git - Downloading macOS Windows: Git - Downloading Windows Linux/Unix: Git (git-scm.com) 创建新仓库 本地创建新仓库:创建新文件夹,进入文件夹目录,执行指令 git init ,用以创建新的git 克隆仓库 执行指令用以创建一个本地仓库的

【北交大信息所AI-Max2】使用方法

BJTU信息所集群AI_MAX2使用方法 使用的前提是预约到相应的算力卡,拥有登录权限的账号密码,一般为导师组共用一个。 有浏览器、ssh工具就可以。 1.新建集群Terminal 浏览器登陆10.126.62.75 (如果是1集群把75改成66) 交互式开发 执行器选Terminal 密码随便设一个(需记住) 工作空间:私有数据、全部文件 加速器选GeForce_RTX_2080_Ti

【Linux 从基础到进阶】Ansible自动化运维工具使用

Ansible自动化运维工具使用 Ansible 是一款开源的自动化运维工具,采用无代理架构(agentless),基于 SSH 连接进行管理,具有简单易用、灵活强大、可扩展性高等特点。它广泛用于服务器管理、应用部署、配置管理等任务。本文将介绍 Ansible 的安装、基本使用方法及一些实际运维场景中的应用,旨在帮助运维人员快速上手并熟练运用 Ansible。 1. Ansible的核心概念