使用pkg-config升級和切換glib庫
前幾天有人問我如何升級glib庫,並在各個版本之間切換。本想用rpm安裝的,結果發現glib安裝包不支援修改安裝目錄,如下圖。
如此,只能在編譯原始碼時指定安裝路徑了。其實,我這是為了演示升級才安裝glib庫,我本身不需要它,所以不要問我如何使用glib提供的功能~
首先下載了glib2.4,解壓後看看glib提供了哪些配置選項(都說只是演示庫的升級,我並不想完整安裝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>.
./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:
Makefile中使用了pkg-config工具來管理庫版本,做到自由切換庫的目的。這裡從網上摘抄一段對pkg-config的描述: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` $<
"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-config和ldconfig
最近一段時間在研究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
使用GCC和pkg-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 創建.a和framework靜態庫(轉)
通過 不用 方式 源碼 右鍵 eos 一個 iphone5s 最終 最近因為項目中的聊天SDK,需要封裝成靜態庫,所以實踐了一下創建靜態庫的步驟,做下記錄。 庫介紹 庫從本質上來說是一種可執行代碼的二進制格式,可以被載入內存中執行。庫分靜態庫和動態庫兩種。iOS中的靜態