1. 程式人生 > >glib 安裝解決以及編譯相關知識

glib 安裝解決以及編譯相關知識

從原始碼包安裝軟體最重要的就是仔細閱讀README INSTALL等說明檔案


通常從原始碼包安裝軟體的步驟是:
tar jxvf gtk+-2.4.13.tar.bz2 解開原始碼包
cd gtk+-2.4.13/ 進入原始碼目錄
./configure 似乎在某些環境下./configure會造成終端退出
而使用. configure則會正常執行,如果有這個現象,就試試 . configure

通過configure程式猜測主機資訊,最終建立Makefile,以完成make,所以如果./configure不成功而去make的話,就會出現"make: *** No targets specified and no makefile found. Stop."

make 當./configure成功結束後,就開始正式編譯程式了.
make install 編譯成功後使用make install安裝
make uninstall 某些軟體支援解除安裝,可能使用該方法解除安裝,如果支援的話,通常會在README中寫到(似乎比較少)

configure程式帶有很多引數,可以通過 ./configure --help 檢視詳細內容,通常位於前面的是常規configure的
引數說明,末尾是該程式的可用引數說明。
./configure --prefix=/usr 指定安裝目錄,通常從原始碼包編譯安裝的軟體預設會放在/usr/local下
因為這是FHS(Filesystem Hierarchy Standard)的規定,不知道什麼是FHS?看看這篇文章吧:

http://www.pathname.com/fhs/pub/fhs-2.3.html 相信它會讓你對linux系統結構有更好的理解,很值得讀讀。

再說一下幾個關係到能否成功編譯的東東:/etc/ld.so.conf ldconfig PKG_CONFIG_PATH

首先說下/etc/ld.so.conf:

這個檔案記錄了編譯時使用的動態連結庫的路徑。
預設情況下,編譯器只會使用/lib和/usr/lib這兩個目錄下的庫檔案
如果你安裝了某些庫,比如在安裝gtk+-2.4.13時它會需要glib-2.0 >= 2.4.0,辛苦的安裝好glib後
沒有指定 --prefix=/usr 這樣glib庫就裝到了/usr/local下,而又沒有在/etc/ld.so.conf中新增/usr/local/lib

這個搜尋路徑,所以編譯gtk+-2.4.13就會出錯了
對於這種情況有兩種方法解決:
一:在編譯glib-2.4.x時,指定安裝到/usr下,這樣庫檔案就會放在/usr/lib中,gtk就不會找不到需要的庫檔案了
對於安裝庫檔案來說,這是個好辦法,這樣也不用設定PKG_CONFIG_PATH了 (稍後說明)

二:將/usr/local/lib加入到/etc/ld.so.conf中,這樣安裝gtk時就會去搜索/usr/local/lib,同樣可以找到需要的庫
將/usr/local/lib加入到/etc/ld.so.conf也是必須的,這樣以後安裝東東到local下,就不會出現這樣的問題了。
將自己可能存放庫檔案的路徑都加入到/etc/ld.so.conf中是明智的選擇 ^_^
新增方法也極其簡單,將庫檔案的絕對路徑直接寫進去就OK了,一行一個。例如:
/usr/X11R6/lib
/usr/local/lib
/opt/lib

再來看看ldconfig是個什麼東東吧 :

它是一個程式,通常它位於/sbin下,是root使用者使用的東東。具體作用及用法可以man ldconfig查到
簡單的說,它的作用就是將/etc/ld.so.conf列出的路徑下的庫檔案 快取到/etc/ld.so.cache 以供使用
因此當安裝完一些庫檔案,(例如剛安裝好glib),或者修改ld.so.conf增加新的庫路徑後,需要執行一下/sbin/ldconfig
使所有的庫檔案都被快取到ld.so.cache中,如果沒做,即使庫檔案明明就在/usr/lib下的,也是不會被使用的,結果
編譯過程中抱錯,缺少xxx庫,去檢視發現明明就在那放著,搞的想大罵computer蠢豬一個。 ^_^
我曾經編譯KDE時就犯過這個錯誤,(它需要每編譯好一個東東,都要執行一遍),所以切記改動庫檔案後一定要執行一下ldconfig(位於/sbin )。


再來說說 PKG_CONFIG_PATH這個變數吧:

經常在論壇上看到有人問"為什麼我已經安裝了glib-2.4.x,但是編譯gtk+-2.4.x 還是提示glib版本太低阿?
為什麼我安裝了glib-2.4.x,還是提示找不到阿?。。。。。。"都是這個變數搞的鬼。
先來看一個編譯過程中出現的錯誤 (編譯gtk+-2.4.13):

checking for pkg-config... /usr/bin/pkg-config
checking for glib-2.0 >= 2.4.0 atk >= 1.0.1 pango >= 1.4.0... Package glib-2.0 was not found in the pkg-config search path.
Perhaps you should add the directory containing `glib-2.0.pc'
to the PKG_CONFIG_PATH environment variable
No package 'glib-2.0' found

configure: error: Library requirements (glib-2.0 >= 2.4.0 atk >= 1.0.1 pango >= 1.4.0) not met; consider adjusting the PKG_CONFIG_PATH environment variable if your libraries are in a nonstandard prefix so pkg-config can find them.
[[email protected] gtk+-2.4.13]#
很明顯,上面這段說明,沒有找到glib-2.4.x,並且提示應該將glib-2.0.pc加入到PKG_CONFIG_PATH下。
究竟這個pkg-config PKG_CONFIG_PATH glib-2.0.pc 是做什麼的呢? let me tell you ^_^
先說說它是哪冒出來的,當安裝了pkgconfig-x.x.x這個包後,就多出了pkg-config,它就是需要PKG_CONFIG_PATH的東東
pkgconfig-x.x.x又是做什麼的? 來看一段說明:

程式碼:

The pkgconfig package contains tools for passing the include path and/or library paths to build tools during the make file execution. pkg-config is a function that returns meta information for the specified library. The default setting for PKG_CONFIG_PATH is /usr/lib/pkgconfig because of the prefix we use to install pkgconfig. You may add to PKG_CONFIG_PATH by exporting additional paths on your system where pkgconfig files are installed. Note that PKG_CONFIG_PATH is only needed when compiling packages, not during run-time.

我想看過這段說明後,你已經大概瞭解了它是做什麼的吧。
其實pkg-config就是向configure程式提供系統資訊的程式,比如軟體的版本啦,庫的版本啦,庫的路徑啦,等等
這些資訊只是在編譯其間使用。你可以 ls /usr/lib/pkgconfig 下,會看到許多的*.pc,用文字編輯器開啟
會發現類似下面的資訊:

prefix=/usr
exec_prefix=${prefix}
libdir=${exec_prefix}/lib
includedir=${prefix}/include

glib_genmarshal=glib-genmarshal
gobject_query=gobject-query
glib_mkenums=glib-mkenums

Name: GLib
Description: C Utility Library
Version: 2.4.7
Libs: -L${libdir} -lglib-2.0
Cflags: -I${includedir}/glib-2.0 -I${libdir}/glib-2.0/include

明白了吧,configure就是靠這些資訊判斷你的軟體版本是否符合要求。並且得到這些東東所在的位置,要不去哪裡找呀。
不用我說你也知道為什麼會出現上面那些問題了吧。

解決的辦法很簡單,設定正確的PKG_CONFIG_PATH,假如將glib-2.x.x裝到了/usr/local/下,那麼glib-2.0.pc 就會在/usr/local/lib/pkgconfig下,將這個路徑新增到PKG_CONFIG_PATH下就可以啦。並且確保configure找 到的是正確的glib-2.0.pc,就是將其他的lib/pkgconfig目錄glib-2.0.pc幹掉就是啦。(如果有的話 ^-^)
設定好後可以加入到~/.bashrc中,例如:
PKG_CONFIG_PATH=/opt/kde-3.3.0/lib/pkgconfig:/usr/lib/pkgconfig:/usr/local/pkgconfig:
/usr/X11R6/lib/pkgconfig
[[email protected] ~]#echo $PKG_CONFIG_PATH
/opt/kde-3.3.0/lib/pkgconfig:/usr/lib/pkgconfig:/usr/local/pkgconfig:/usr/X11R6/lib/pkgconfig
(這裡另外一種解決方案是:將需要的其他目錄的***.pc檔案直接copy到/usr/lib/pkgconfig下)
從上面可以看出,安裝庫檔案時,指定安裝到/usr,是很有好處的,無論是/etc/ld.so.conf還是PKG_CONFIG_PATH
預設都會去搜索/usr/lib的,可以省下許多麻煩,不過從原始碼包管理上來說,都裝在/usr下
管理是個問題,不如裝在/usr/local下方便管理
其實只要設定好ld.so.conf,PKG_CONFIG_PATH路徑後,就OK啦 ^_^

另外某些軟體因為版本原因(比如emacs-21.3),在gcc-3.4.x下編譯無法成功,(make 出錯)
使用低版本的gcc就可能編譯通過。
可能是因為gcc-3.3.x和gcc-3.4.x變化很大的緣故吧。

暫時想到了這麼多,先記下這些吧,如果你對原始碼包編譯有了一點的瞭解,就不枉我打了這麼半天字啦。 ^_^

另外./configure 通過,make 出錯,遇到這樣的問題比較難辦,只能憑經驗查詢原因,比如某個標頭檔案沒有找到,
這時候要順著出錯的位置一行的一行往上找錯,比如顯示xxxx.h no such file or directory 說明缺少標頭檔案
然後去google搜。
或者找到感覺有價值的錯誤資訊,拿到google去搜,往往會找到解決的辦法。還是開始的那句話,要仔細看README,INSTALL
程式如何安裝,需要什麼依賴檔案,等等。

另外對於newbie來說,編譯時,往往不知道是否成功編譯通過,而編譯沒有通過就去make install
必然會出錯,增加了解決問題的複雜性,可以通過下面方法檢查是否編譯成功:

一:編譯完成後,輸入echo $? 如果返回結果為0,則表示正常結束,否則就出錯了
echo $? 表示 檢查上一條命令的退出狀態,程式正常退出 返回0,錯誤退出返回非0。
二:編譯時,可以用&&連線命令, && 表示"當前一條命令正常結束,後面的命令才會執行",就是"與"啦。
這個辦法很好,即節省時間,又可防止出錯。例:
./configure --prefix=/usr && make && make install

編譯DOSBOX時出現"cdrom.h:20:23: SDL_sound.h: No such file or directory"

今天忽然想回味下經典DOS遊戲,於是編譯這個DOSBOX模擬器,README中說明需要SDL_SOUND
於是下載,安裝,很順利,沒有指定安裝路徑,於是預設的安裝到了/usr/local/
當編譯DOSBOX make 時,出現如下錯誤:
if g++ -DHAVE_CONFIG_H -I. -I. -I../.. -I../../include -I/usr/include/SDL -D_REENTRANT -march=pentium4 -O3 -pipe -fomit-frame-pointer -MT dos_programs.o -MD -MP -MF ".deps/dos_programs.Tpo" -c -o dos_programs.o dos_programs.cpp; \
then mv -f ".deps/dos_programs.Tpo" ".deps/dos_programs.Po"; else rm -f ".deps/dos_programs.Tpo"; exit 1; fi
In file included from dos_programs.cpp:30:
cdrom.h:20:23: SDL_sound.h: No such file or directory <------錯誤的原因在這裡
In file included from dos_programs.cpp:30:
cdrom.h:137: error: ISO C++ forbids declaration of `Sound_Sample' with no type
cdrom.h:137: error: expected `;' before '*' token
make[3]: *** [dos_programs.o] Error 1
make[3]: Leaving directory `/root/software/dosbox-0.63/src/dos'
make[2]: *** [all-recursive] Error 1
make[2]: Leaving directory `/root/software/dosbox-0.63/src'
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory `/root/software/dosbox-0.63'
make: *** [all] Error 2
[[email protected] dosbox-0.63]#
看來是因為cdrom.h沒有找到SDL_sound.h這個標頭檔案
所以出現了下面的錯誤,但是我明明已經安裝好了SDL_sound阿?
經過查詢,在/usr/local/include/SDL/下找到了SDL_sound.h
看來dosbox沒有去搜尋/usr/local/include/SDL下的標頭檔案,既然找到了原因,就容易解決啦

[[email protected] dosbox-0.63]#ln -s /usr/local/include/SDL/SDL_sound.h /usr/include

做個連結到/usr/include下,這樣DOSBOX就可以找到了,順利編譯成功,回味仙劍ing....^_^
曾經編譯Xorg-6.8.1的時候,也出現找不到freetype.h的問題,原因也是如此。
編譯安裝軟體時,經常遇到類似的情況,都是因為找不到需要的標頭檔案而出現錯誤,也許是因為
沒有安裝相關的標頭檔案,或者是安裝了但沒有找到,如上例。
找不到的情況:做個連結到/usr/include下,就可以了。
沒安裝的情況:去google找什麼東東包括該標頭檔案,安裝上就應該可以了。
通常錯誤提示也都是"No such file or directory",所以編譯失敗時要好好找找錯誤資訊哦。
錯誤資訊總是在Error上面不遠的,耐心點 ^_^

不修改/etc/ld.so.conf使用非預設路徑下的庫檔案-----LD_LIBRARY_PATH

環境變數LD_LIBRARY_PATH列出了查詢共享庫時除了預設路徑之外的其他路徑。
如果不想修改或無法修改(無root許可權)/etc/ld.so.conf而使用其他路徑下的庫檔案
就需要設定LD_LIBRARY_PATH了,例:export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/lib
這樣就可以使用/opt/lib下的庫檔案啦。當然還是修改/etc/ld.so.conf方便。

相關推薦

glib 安裝解決以及編譯相關知識

從原始碼包安裝軟體最重要的就是仔細閱讀README INSTALL等說明檔案 通常從原始碼包安裝軟體的步驟是:tar jxvf gtk+-2.4.13.tar.bz2 解開原始碼包cd gtk+-2.4.13/ 進入原始碼目錄./configure 似乎在某些環境下./c

node以及指令相關知識

筆記 顯示 進程 javascrip uri 安裝 腳本語言 directory 以及 Node筆記 Node簡介及配置、快速上手、核心特點、模塊化 Node簡介 客戶端的JavaScript是怎樣的 什麽是 JavaScript? 腳本語言 運行在瀏覽器中 一般用來

Java程式設計師從笨鳥到菜鳥之(二十四)Xml基礎詳解和DTD驗證 Java程式設計師從笨鳥到菜鳥之(二十三)常見亂碼解決以及javaBean基礎知識

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

linux 離線安裝python以及python相關

沒有Root許可權,沒有外網的環境下,無法進行全域性的升級和安裝相關庫,所以就整理了一份如何在Linux環境下使用非root使用者安裝python及其相關的庫,以備不時之需。 第一步、安裝python python版本庫https://www.python.or

windows 離線安裝python以及python相關的包

python 下載:https://www.python.org/downloads/ python 安裝包下載:https://pypi.org 1. 安裝pythton    直接去python官網下載安裝包即可    下載地址:https

python簡易圖片處理(2):環境配置以及Anaconda相關知識

基於python指令碼語言開發的數字影象處理包很多,比如說PIL,Pillow,openCV,scikit-image等。 對這些包進行一個簡單的比較,PIL和Pillow只提供最基礎的數字影象處理,功能有限;openCV實際上是一個C++庫,只是提供了pyt

安裝xcode6 beta 後調試出現Unable to boot the iOS Simulator以及編譯蘋果官方Swift的demo報錯failed with exit code 1的解決的方法

imu fonts mat 詳細說明 watermark data- 重新啟動 技術分享 說明 蘋果昨天公布新語言Swift(雨燕),須要安裝xcode6 以及mac os 系統為10.9以上。 (xcode6 beta 可在官方下載。須要登錄開發人員賬號;mac os

Linux 從原始碼編譯安裝 OpenSSH以及各問題解決

簡單的說 OpenSSH 是一組安全遠端的連線工具,主要包括了幾個部份:ssh、sshd、scp、sftp、ssh-keygen、ssh-agent、ssh-add。OpenSSH 安裝配置比較複雜,難點在配置,特別是在 VPS 中,配置不當就完全無法連結 VPS 了。

MongoDB3.4安裝配置以及與Robomongo1.1的連接——解決Authentication Failed導致的不能連接問題

class .exe oca with www 解決方法 comm ror 命令 本文環境:win10(64)+MongoDB(3.4.5)+Robomongo(1.1) 目錄: MongoDB的安裝 MongoDB的配置 Robomongo的安裝以及與MongoDB的連

jmeter安裝過程以及安裝出錯解決方法

技術 錯誤 安裝 -1 環境 png nbsp net java環境變量 1、安裝最新版的jmter需要1.8的jdk http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-213315

Java學習筆記(二)-------String,StringBuffer,StringBuilder區別以及映射到的同步,異步相關知識

ringbuf 等待 java學習筆記 java學習 單線程 回復 改變 hashtable ble 1. String是不可變類,改變String變量中的值,相當於開辟了新的空間存放新的string變量 2. StringBuffer 可變的類,可以通過append方法改

vs2008編譯錯誤fatal error C1902: 程序數據庫管理器不匹配;請檢查安裝解決

不清楚 錯誤 管理器 編譯 ror 匹配 原因 nbsp erro 重裝了本本上的Xp系統,如往常一樣,升級,裝殺毒軟件,開發工具。一些進行的非常順利。然而,在我打開VS2008準備耕作的時候,盡然出現了一邪惡的錯誤提示:vs2008編譯錯誤fatal error C19

Yum安裝MySQL以及相關目錄路徑和修改目錄

mysqld 修改 oot my.cnf code all 數據 喜歡 clas 有些時候,為了方便,有些同學喜歡通過yum的方式安裝MySQL,沒有設置統一的文件目錄以及軟件目錄,那麽就會為後續的維護工作帶來很大的麻煩! 下面就簡單介紹一下yum安裝MySQL的步驟以及這

ubuntu16.04在英文狀態下安裝中文語言包的過程(法一:圖形界面的方式) 以及 安裝中文語言包後無法選擇漢語問題的解決 以及 安裝搜狗中文輸入法的方法

完成 pan 設置 狀態 重啟 round font back 問題 1、筆記本安裝的ubuntu是桌面的,安裝語言包非常方便,桌面版本選擇 齒輪 --> System --> System Settings... --> Language Suppor

js的預編譯、全局變量、局部變量相關知識

所有 func var 等價 局部變量 () 全局 log not 1、未聲明的變量就賦值, 此變量歸全局變量window對象所有 console.log(a); //a is not defined a=10 console.log(a); //10 等價於 co

win10 +python3.6環境下安裝opencv以及pycharm導入cv2有問題的解決辦法

eclipse 需要 info nbsp tail 博客 令行 嘗試 功能 一、安裝opencv   借鑒的這篇博客已經寫得很清楚了--------https://blog.csdn.net/u011321546/article/details/79499598

appium+python解決每次運行代碼都提示安裝Unlock以及AppiumSetting的問題

soft shu -h reg desktop all 安裝路徑 roi js文件 appium+python解決每次運行代碼都提示安裝Unlock以及AppiumSetting的問題(部分安卓機型) 1、修改appium-android-driver\lib下的and

Linux(centos 7) 安裝Nginx 以及報錯 yum install zlib Error: Multilib version problems found. 解決方法

今天安裝 Nginx出現如下報錯: yum install zlib Loaded plugins: fastestmirror, langpacks Loading mirror speeds from cached hostfile Resolving Dependencies -->

解決app在Android P中安裝失敗以及不相容問題

Android P即Android 9.0 在Google IO2018正式面向全球釋出,它的代號是Pie,仍然基於Linux核心構建。全新的手勢操作選項。底部虛擬鍵將由小白點和一顆返回鍵取代。通過輕觸回到主頁、長按撥出語音助手。新的特性主要有: 利用 Wi-Fi RTT 進行室

intellij idea http proxy 設定解決plugins安裝失敗以及導致問題

為解決idea plugins 安裝和更新失敗,可以通過配置http proxy新增代理。 本地安裝配置好代理伺服器 配置方法:File>Settings>HTTP Proxy>Manual proxy configuration Host name:127.0.0.1 Port n