1. 程式人生 > >使用pkg-config升級和切換glib庫

使用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版本。感覺這像是編譯連線時的多型~

相關推薦

使用pkg-config升級切換glib

    前幾天有人問我如何升級glib庫,並在各個版本之間切換。本想用rpm安裝的,結果發現glib安裝包不支援修改安裝目錄,如下圖。         如此,只能在編譯原始碼時指定安裝路徑了。其實,我這是為了演示升級才安裝glib庫,我本身不需要它,所以不要問我如何使用g

windows下python 安裝igraph報錯 Cannot find the C core of igraph on this system using pkg-config.的解決

     筆者在執行網上給的機器學習程式碼的時候,發現Anaconda 2.5.0 (64-bit)並沒有提供該庫,後來我在github上找到了官方的igraph,結果安裝的時候出現如下錯誤:缺少c模組 經過長時間的摸索,沒有找到c模組對應的處理辦法。但是從stacko

Linux環境下原始碼編譯執行常用的兩個命令:pkg-configldconfig

        最近一段時間在研究linux伺服器叢集的相關知識,打算基於corosync和pacemaker來搭建一個linux高可用叢集, 通過編譯原始碼包來了解其依賴的動態庫,在編譯的過程中遇到一些問題,總結一些,供大家以後參考(很通用哦):        我們

pkg-config的用法及搜尋路徑設定

一、編譯和連線         一般來說,如果庫的標頭檔案不在 /usr/include 目錄中,那麼在編譯的時候需要用 -I 引數指定其路徑。由於同一個庫在不同系統上可能位於不同的目錄下,使用者安裝庫的時候也可以將庫安裝在不同的目錄下,所以即使使用同一個庫,由於庫的路徑的 不同,造成了用 -I 引數指定

[copied]pkg-config 命令的瞭解使用

背景:copy自163部落格,所以無法直接做轉載文章。贊作者的好文。給出連結:pkg-config命令的瞭解與用法 目的:以下文字的記錄,在於方便隨時自己的查詢。 1.首先,什麼是pkg-config: pkg-config 當你從原始碼編譯軟體時,用來提供依賴

“make install 之後 pkg-config 找不到”的解決方法

問題描述 通過原始碼編譯,然後make install 的方式安裝一個庫之後,pkg-config 不能正確給出以安裝的這個庫的 標頭檔案 和 庫檔案 的資訊。 比如,通過原始碼編譯,然後 make install 的方式安裝了 libavutil 庫,但是 pkg-c

pkg-config 在不同opencv中切換

從上面的例子,可以看出,pkg-config給出了opencv的標頭檔案和庫的所有資訊! pkg-config --cflag opencv               檢視標頭檔案路徑 pkg-config --libs opencv              

使用GCCpkg-config編譯

gcc -Wall -g Test.c -o Test `pkg-config --cflags --libs gstreamer-0.10` GCC編譯器是Linux下標準C的編譯器 上述編譯命令傳遞了幾個編譯選項 -Wall 開啟了所有編譯警告 -g 開啟了除錯功能,因

Glib的安裝編譯

Glib概述Glib是一個多種用途的工具庫,它提供許多有用的資料型別,巨集定義,型別變換,字串工具,檔案工具,主迴圈的抽象等等。它可以用於許多類-UNIX平臺、Windows,OS/2和BeOS中。GLib在GNU庫通用公共許可(GNU LGPL)下發布。 GLib的主要策

g++ pkg-config 編譯opencv專案

前提: 已經安裝好opencv和pkg-config,如果沒有,請用brew安裝。 注意先安裝pkg-config再安裝opencv。 指令: linux: g++ $(pkg-config --cflags --libs opencv) tes

本地私有遠端私有升級

以在庫中新增新的類為例子 1.本地私有庫的升級     只需要把新增的類 拖入到 classes 資料夾中 然後在 podfile 檔案目錄中 重新 pod install 即可 2.遠端私有庫的升級     2.1  把新增的類 拖入到 classes 資料夾中  

pkg-config命令瞭解使用

最常用的有: pkg-config 庫的名稱(比如,)--libspkg-config 庫的名稱(比如,)--cflags或者:pkg-config 庫的名稱(比如,opencv)--libs --cflags 1:pkg-config --libs --cflags   輸出:編譯和連結使用 -I/u

Package gtk+-3.0 was not found in the pkg-config search path

path 二進制 all 項目 有時 rpm fedora ack share 問題描述:   在fedora21系統上通過rpmbuild構建fcitx的二進制包時出現以上錯誤,經老程序員指點:“是相應的開發包沒有安裝” 解決辦法:   yum installl gtk3

jenkins 升級 jenkins備份

jenkins[[email protected]/* */ ~]# rpm -ql jenkins /etc/init.d/jenkins/etc/logrotate.d/jenkins/etc/sysconfig/jenkins/usr/lib/jenkins/usr/lib/jenkins/

SOAPUI中文教程---腳本腳本

text media color call 更新 編輯 清理 現在 chang SoapUI為腳本編寫提供了廣泛的選擇,使用Groovy或Javascript(由SoupUI 3.0開發)作為腳本語言,使用哪些選項可在左下方的項目詳細信息選項卡中設置項目級別。 這裏提供的大

Ubuntu 16.04 LTS 安裝libvips出現”Package vips was not found in the pkg-config search path”

arp dir exp export ron per gconf 部署 director 使用libvips來操作圖像,libvips的部署參考一個Node.js工程:https://github.com/lovell/sharp 在MAC下安裝很順利,到Linux環境下(

git 分支的創建切換

tno pow qpi apt hrn try fun zabb pso 每次提交,GIT 都會將他們串成一個時間線,截止到目前,只有一個時間線,GIT裏叫這個分支為主分支,叫master,HEAD指向master,master指向提交,HEAD指向當前的分支. 一開始的時

python實現綠色軟件的升級,包括單文件升級多文件升級

odi dev argv odin txt 註意 store isf out # coding:utf-8 import sys, os, time import zipfile import shutil def print_usage(): print ‘

Ubuntu16.04多個版本GCC編譯器的安裝切換

spa tails con native com csdn lan 多個 遇到 這幾天在配置交叉編譯ARM開發板的linux內核的過程中碰到了很多問題,其中包括了GCC版本太高等問題,由此我打算安裝其他老的版本給我的Ubuntu16.04.實驗過程如下: 1、首先查看一下當

Xcode 創建.aframework靜態(轉)

通過 不用 方式 源碼 右鍵 eos 一個 iphone5s 最終 最近因為項目中的聊天SDK,需要封裝成靜態庫,所以實踐了一下創建靜態庫的步驟,做下記錄。 庫介紹 庫從本質上來說是一種可執行代碼的二進制格式,可以被載入內存中執行。庫分靜態庫和動態庫兩種。iOS中的靜態