A. 如何查看linux動態鏈接庫文件的版本等其他信息
ldd <可執行文件名> 查看可執行文件鏈接了哪些
系統動態鏈接庫
nm <可執行文件名>
查看可執行文件裡面有哪些符號
strip <可執行文件名>
去除符號表可以給可執行文件瘦身
如果我們想從可執行程序裡面提取出來一點什麼文本信息的話,還可以用strings命令
strings
<可執行文件名>
Linux操作系統上面的動態共享庫大致分為三類:
1、操作系統級別的共享庫和基礎的系統工具庫
比方說libc.so, libz.so,
libpthread.so等等,這些系統庫會被放在/lib和/usr/lib目錄下面,如果是64位操作系統,還會有/lib64和/usr
/lib64目錄。如果操作系統帶有圖形界面,那麼還會有/usr/X11R6/lib目錄,如果是64位操作系統,還有/usr/X11R6
/lib64目錄。此外還可能有其他特定Linux版本的系統庫目錄。
這些系統庫文件的完整和版本的正確,確保了Linux上面各種程序能夠正常的運行。
2、應用程序級別的系統共享庫
並非操作系統自帶,但是可能被很多應用程序所共享的庫,一般會被放在/usr/local/lib和/usr/local/lib64這兩個目錄下面。很多你自行編譯安裝的程序都會在編譯的時候自動把/usr/local/lib加入gcc的-L參數,而在運行的時候自動到/usr/local
/lib下面去尋找共享庫。
以上兩類的動態共享庫,應用程序會自動尋找到他們,並不需要你額外的設置和擔心。這是為什麼呢?因為以上這些目錄默認就被加入到動態鏈接程序的搜索路徑裡面了。Linux的系統共享庫搜索路徑定義在/etc/ld.so.conf這個配置文件裡面。這個文件的內容格式大致如下:
/usr/X11R6/lib64
/usr/X11R6/lib
/usr/local/lib
/lib64
/lib
/usr/lib64
/usr/lib
/usr/local/lib64
/usr/local/ImageMagick/lib
假設我們自己編譯安裝的ImageMagick圖形庫在/usr/local/ImageMagick目錄下面,並且希望其他應用程序都可以使用
ImageMagick的動態共享庫,那麼我們只需要把/usr/local/ImageMagick/lib目錄加入/etc/ld.so.conf文件裡面,然後執行:ldconfig
命令即可。
ldcofig將搜索以上所有的目錄,為共享庫建立一個緩存文件/etc/ld.so.cache。為了確認ldconfig已經搜索到ImageMagick的庫,我們可以用上面介紹的strings命令從ld.so.cache裡面抽取文本信息來檢查一下:
strings
/etc/ld.so.cache | grep ImageMagick
輸出結果為:
/usr/local/ImageMagick/lib/libWand.so.10
/usr/local/ImageMagick/lib/libWand.so
/usr/local/ImageMagick/lib/libMagick.so.10
/usr/local/ImageMagick/lib/libMagick.so
/usr/local/ImageMagick/lib/libMagick++.so.10
/usr/local/ImageMagick/lib/libMagick++.so
已經成功了!
3、應用程序獨享的動態共享庫
有很多共享庫只被特定的應用程序使用,那麼就沒有必要加入系統庫路徑,以免應用程序的共享庫之間發生版本沖突。因此Linux還可以通過設置環境變數LD_LIBRARY_PATH來臨時指定應用程序的共享庫搜索路徑,就像我們上面舉的那個例子一樣,我們可以在應用程序的啟動腳本裡面預先設置
LD_LIBRARY_PATH,指定本應用程序附加的共享庫搜索路徑,從而讓應用程序找到它。
B. Linux下怎麼獲得c庫版本怎麼動態的獲得c編譯器版本
外部調用 gcc -v 抓取最後一行吧
libc庫可以直接外部運行 /lib/libc.so.6,或者用 /usr/include/gnu/libc-version.h 里的兩個函數找
C. Linux下的靜態庫和動態庫
靜態庫
可以把它想像成是一些代碼的集合,在可執行程序運行前就已經加到了代碼中,成為了執行程序的一部分,一般是以.a為後綴的文件名,Windows下後綴為.lib。靜態庫的命名也分為三部分,1、前綴:lib,2、庫的名稱:隨意,如lisi,3、後綴:.a。
靜態庫優缺點
上面簡單介紹了靜態庫,那它自然也會有優缺點,這里來介紹下它的優缺點。
優點:1、在最後,函數庫是被打包到應用程序中的,實現函數本地化、定址方便、高效。2、程序在運行的時候,與函數庫沒有關系,移植性更強。
缺點:1、消耗資源較大,每個進程在使用靜態庫的時候,都要復制一份才可以,這也就造成了內存的消耗。2、在程序更新、部署、發布的時候,使用靜態庫相對麻煩,如果一個靜態庫更新了,那它的應用程序都需要重新編譯,再發送給用戶,有的時候可能只是一個小的改動,但對於用戶來說,會導致整個程序重新下載。
動態庫
在程序編譯時不會被連接到目標代碼中,在後期運行時才會載入,不同的應用程序如果調用相同的庫,內存中只有一份共享庫的拷貝,也就避免了空間的浪費問題。一般以.so作為文件後綴名,也分為三部分:1、前綴:lib,2、庫名稱:自定義,3、後綴:.so
動態庫優缺點
優點:1、節省內存2、部署、升級相對方便,只需要更換動態庫,再重新啟動服務即可。
缺點:1、載入速度比靜態庫慢2、移植性較差,需要把所有用到的動態庫進行移植。
D. linux下安裝了6.1.0版本的gcc,但cmake時用的還是舊版的gcc
這個應該是動態庫的問題吧,我之前遇到的問題就是這樣解決的:
strings /usr/lib64/libstdc++.so.6 | grep GLIBC\檢查動態庫
mv /usr/lib64/libstdc++.so.6 /tmp
ln -s /usr/local/lib64/libstdc++.so.6 /usr/lib64/libstdc++.so.6
首先可以檢查目前的鏈接庫:
[root@ops-test01 gcc-6.1.0]# strings /usr/lib64/libstdc++.so.6 | grep GLIBC
GLIBCXX_3.4
GLIBCXX_3.4.1
GLIBCXX_3.4.2
GLIBCXX_3.4.3
GLIBCXX_3.4.4
GLIBCXX_3.4.5
GLIBCXX_3.4.6
GLIBCXX_3.4.7
GLIBCXX_3.4.8
GLIBCXX_3.4.9
GLIBCXX_3.4.10
GLIBCXX_3.4.11
GLIBCXX_3.4.12
GLIBCXX_3.4.13
GLIBC_2.2.5
GLIBC_2.3
GLIBC_2.4
GLIBC_2.3.2
GLIBCXX_FORCE_NEW
GLIBCXX_DEBUG_MESSAGE_LENGTH
果然是老的鏈接 ,GLIBCXX_3.4.13往後的都沒有了
搜索新的鏈接庫位置:
root@ops-test01 gcc-6.1.0]# find / -name libstdc++.so.6
/usr/lib64/libstdc++.so.6
/usr/local/lib64/libstdc++.so.6
/usr/local/src/gcc-6.1.0/build/stage1-x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6
/usr/local/src/gcc-6.1.0/build/prev-x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6
/usr/local/src/gcc-6.1.0/build/x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6
/root/vmware-tools-distrib/caf/usr/lib/vmware-caf/pme/lib/libstdc++.so.6
/root/vmware-tools-distrib/lib/lib64/libstdc++.so.6
/root/vmware-tools-distrib/lib/lib64/libstdc++.so.6/libstdc++.so.6
/root/vmware-tools-distrib/lib/lib32/libstdc++.so.6
/root/vmware-tools-distrib/lib/lib32/libstdc++.so.6/libstdc++.so.6
查找鏈接客戶的內容,然後確定/usr/local/lib64/libstdc++.so.6是新的鏈接庫,
移除老的鏈接庫,然後關聯新的鏈接庫:
[root@ops-test01 gcc-6.1.0]# mv /usr/lib64/libstdc++.so.6 /tmp
[root@ops-test01 lib64]# cd /usr/lib64
[root@ops-test01 lib64]# ln -s /usr/local/lib64/libstdc++.so.6 libstdc++.so.6
[root@ops-test01 lib64]# strings /usr/lib64/libstdc++.so.6 | grep GLIBC
GLIBCXX_3.4
GLIBCXX_3.4.1
GLIBCXX_3.4.2
GLIBCXX_3.4.3
GLIBCXX_3.4.4
GLIBCXX_3.4.5
GLIBCXX_3.4.6
GLIBCXX_3.4.7
GLIBCXX_3.4.8
GLIBCXX_3.4.9
GLIBCXX_3.4.10
GLIBCXX_3.4.11
GLIBCXX_3.4.12
GLIBCXX_3.4.13
GLIBCXX_3.4.14
GLIBCXX_3.4.15
GLIBCXX_3.4.16
GLIBCXX_3.4.17
GLIBCXX_3.4.18
GLIBCXX_3.4.19
GLIBCXX_3.4.20
GLIBCXX_3.4.21
GLIBCXX_3.4.22
GLIBC_2.3
GLIBC_2.2.5
GLIBC_2.3.2
GLIBCXX_FORCE_NEW
GLIBCXX_DEBUG_MESSAGE_LENGTH
ok,現在在編譯試試!!更多 Linux知識建議參考《Linux就該這樣學》,加油!!!