Ⅰ 求助linux大神!非root用戶安裝軟體時如何調用系統的庫文件
一般你增加庫文件目錄後,需要用ldconfig 更新庫文件路徑的。
首先你要修改 /etc/ld.so.conf(不同發行版本不一樣,你需要自己修改對應發行版本下的文件),增加你的庫文件所在的目錄,然後運行sudo ldconfig更新一下庫緩存即可。
基於安全因素,你必須要有root許可權運行這一次即可,以後不在需要了。
理論上,zlib這些庫應該已經安裝了的,請檢查你的php是否安裝正確?
Ⅱ linux 中 庫文件/lib /usr/lib屬不屬於內核的一部分,如果不屬於是不是各個發行商開發的
庫文件分成內核函數庫,c庫,應用程序庫
內核庫你是看不見的,因為內核編譯好後就是一個文件vmlinux。
c庫是獨立於linux的,甚至是高於linux,因為linux的api開發是符合posix c標準的。c庫獨立於linux安裝,你可以重新安裝你的linux電腦上的glibc庫,怎麼安裝就要深入學習了。
應用程序庫包括你的計算機上安裝的軟體提供的庫甚至是你自己編寫的庫。
因此,/lib /usr/lib當然不是內核的一部分,裡面可以是c庫,或者應用程序庫。你所謂的不同版本的linux的表述也是不清晰的,分清楚兩個概念,linux內核和linux發行版。linux內核在你的電腦上只是一個文件vmlinux,其他的全是應用軟體。
至於庫函數如何與內核互通,我可以告訴你是通過系統調用,但你暫時肯定是理解不了的,慢慢學吧。加油!
Ⅲ 請問linux里頭文件與庫文件有什麼區別
頭文件中有函數的申明,庫文件實現函數的定義。
比如,printf函數。使用時應包括stdio.h,專打開stdio.h你只屬能看到,printf這
個函數的申明,卻看不到printf具體是怎麼實現的,而函數的實現在相應的C庫
中。而庫文件一般是以二進制形式而不是C源文件形式提供給用戶使用的。程序
中包括了stdio.h這個頭文件。鏈接器就能根據頭件中的信息找到printf這個函
數的實現並鏈接進這個程序代碼段里。
總結起來就是,庫文件通過頭文件向外導出介面。用戶通過頭文件找到庫文件中
函數實現的代碼從而把這段代碼鏈接到用戶程序中去。
Ⅳ Linux如何解決動態庫的版本控制
3.共享庫,小版本升級,即介面不變.
當升級小版本時,共享庫的soname 是不變的,所以需要重新把soname 的那個連接文件指定新版本就可以。 調用ldconfig命令,系統會幫你做修改那個soname link文件,並把它指向新的版本呢。這時候你的應用程序就自動升級了。
4.共享庫,主版本升級,即介面發生變化。
當升級主版本時,共享庫的soname 就會加1.比如libhello.so.0.0.0 變為 libhello.so.1.0.0. 這時候再運行ldconfig 文件,就會發現生成兩個連接 文件。
ln -s libhello.so.0----libhello.so.0.0.0
ln -s libhello.so.1-----libhello.so.1.0.0
盡管共享庫升級,但是你的程序依舊用的是舊的共享庫,並且兩個之間不會相互影響。
問題是如果更新的共享庫只是增加一些介面,並沒有修改已有的介面,也就是向前兼容。但是這時候它的主版本號卻增加1. 如果你的應用程序想調用新的共享庫,該怎麼辦? 簡單,只要手工把soname 文件修改,使其指向新的版本就可以。(這時候ldconfig 文件不會幫你做這樣的事,因為這時候soname 和real name 的版本號主板本號不一致,只能手動修改)。
比如: ln -s libhello.so.0 --- libhello.so.1.0.0
但是有時候,主版本號增加,介面發生變化,可能向前不兼容。這時候再這樣子修改,就會報錯,「xx」方法找不到之類的錯誤。
總結一下,Linux 系統是通過共享庫的三個不同名字,來管理共享庫的多個版本。 real name 就是共享庫的實際文件名字,soname 就是共享庫載入時的用的文件名。在生成共享庫的時候,編譯器將soname 綁定到共享庫的文件頭里,二者關聯起來。 在應用程序引用共享庫時,其通過link name 來完成,link時將按照系統指定的目錄去搜索link名字找到共享庫,並將共享庫的soname寫在應用程序的頭文件里。當應用程序載入共享庫時,就會通過soname在系統指定的目錄(path or LD_LIBRARY)去尋找共享庫。
當共享庫升級時,分為兩種。一種是主板本不變,升級小版本和build 號。在這種情況下,系統會通過更新soname( ldconfig 來維護),來使用新的版本號。這中情況下,舊版本就沒有用,可以刪掉。
另外一種是主版本升級,其意味著庫的介面發生變化,當然,這時候不能覆蓋已有的soname。系統通過增加一個soname(ldconfig -p 裡面增加一項),使得新舊版本同時存在。原有的應用程序在載入時,還是根據自己頭文件的舊soname 去尋找老的庫文件。
這是一個trick 的地方。第一系統將會在生成庫的時候,就沒有soname放到庫的頭裡面。從而應用程序連接時候,就把linkname 放到應用程序依賴庫裡面。或者換句話說就是,soname這時候不帶版本號。 有時候有人直接利用這點來升級應用程序,比如,新版本的庫,直接拷貝到系統目錄下,就會覆蓋掉已經存在的舊的庫文件,直接升級。 這個給程序員很大程度的便利性,如果一步小心,就會調到類似windows的Dll hell 陷阱裡面。建議不要這樣做。
【Note】
1. 指定共享庫載入的路徑。LD_LIBRARY_PATH 優先於 path 環境變數。
2. ldd 可以查看程序,或者共享庫依賴的庫的路徑
3. nm 查看共享庫暴露的介面
4. ldconfig 可以自動生成soname 的連接文件。並提供catch 加速查找。
5.readelf 可以查看動態庫的信息,比如依賴的庫,本身的soname。
6. objmp 與readelf 類似。
7 ld The GUN linker
8. ld.so dynamic linker or loader
9. as the portable GNU assembley
Ⅳ linux中jpeglib庫文件我安裝了,但是我運行自己寫的代碼老是找不到這個庫
export LD_LIBRARY_PATH=/usr/local/lib
就可以了。但這個方法是一次性的,這個設置只保存在內存專,關閉終端再開啟就沒了。
網上搜索後屬發現~/.bashrc文件在每次登陸和每次打開
shell 都讀取一次,~/.bash_profile在登陸時讀取一次,所以可以把配置語句寫進其中一個:
[plain] view plain
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib
可以直接命令行輸入:
[plain] view plain
echo 'export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib' >> ~/.bashrc
也可以用vim編輯器打開編輯。
這樣每次打開終端,系統就實現自動配置了。