gcc -v、rpm -qa glibc、rpm -qa zlib。
FC6可以用這些命令,rpm -qa gcc glibc zlib。
補充:Linux是一套免費使用和自由傳播的類Unix操作系統,是一個基於POSIX和UNIX的多用戶、多任務、支持多線程和多CPU的操作系統。它能運行主要的UNIX工具軟體、應用程序和網路協議。它支持32位和64位硬體。Linux繼承了Unix以網路為核心的設計思想,是一個性能穩定的多用戶網路操作系統。
Linux操作系統誕生於1991 年10 月5 日(這是第一次正式向外公布時間)。Linux存在著許多不同的Linux版本,但它們都使用了Linux內核。Linux可安裝在各種計算機硬體設備中,比如手機、平板電腦、路由器、視頻游戲控制台、台式計算機、大型機和超級計算機。
嚴格來講,Linux這個詞本身只表示Linux內核,但實際上人們已經習慣了用Linux來形容整個基於Linux內核,並且使用GNU 工程各種工具和資料庫的操作系統。
② linux下的靜態庫與動態庫的區別和使用
一、引言
我們通常把一些公用函數製作成函數庫,供其它程序使用。
函數庫分為靜態庫和動態庫兩種。
通常情況下,對函數庫的鏈接是放在編譯時期(compile time)完成的。所有相關的對象文件(object file)與牽涉到的函數庫(library)被鏈接合成一個可執行文件(executable file)。程序在運行時,與函數庫再無瓜葛,因為所有需要的函數已拷貝到相應目錄下下。所以這些函數庫被成為靜態庫(static libaray),通常文件名為「libxxx.a」的形式。
其實,我們也可以把對一些庫函數的鏈接載入推遲到程序運行的時期(runtime)。這就是動態鏈接庫(dynamic link library)技術。
二、兩者區別:
a,靜態庫的使用需要:
1 包含一個對應的頭文件告知編譯器lib文件裡面的具體內容
2 設置lib文件允許編譯器去查找已經編譯好的二進制代碼
b,動態庫的使用:
程序運行時需要載入動態庫,對動態庫有依賴性,需要手動加入動態庫
c,依賴性:
靜態鏈接表示靜態性,在編譯鏈接之後, lib庫中需要的資源已經在可執行程序中了, 也就是靜態存在,沒有依賴性了
動態,就是實時性,在運行的時候載入需要的資源,那麼必須在運行的時候提供 需要的 動態庫,有依賴性, 運行時候沒有找到庫就不能運行了
d,區別:
簡單講,靜態庫就是直接將需要的代碼連接進可執行程序;動態庫就是在需要調用其中的函數時,根據函數映射表找到該函數然後調入堆棧執行。
做成靜態庫可執行文件本身比較大,但不必附帶動態庫
做成動態庫可執行文件本身比較小,但需要附帶動態庫
鏈接靜態庫,編譯的可執行文件比較大,當然可以用strip命令精簡一下(如:strip libtest.a),但還是要比鏈接動態庫的可執行文件大。程序運行時間速度稍微快一點。
靜態庫是程序運行的時候已經調入內存,不管有沒有調用,都會在內存里頭。靜態庫在程序編譯時會被連接到目標代碼中,程序運行時將不再需要該靜態庫。
其在編譯程序時若鏈接,程序運行時會在系統指定的路徑下搜索,然後導入內存,程序一般執行時間稍微長一點,但編譯的可執行文件比較小;動態庫是程序運行的時候需要調用的時候才裝入內存,不需要的時候是不會裝入內存的。
動態庫在程序編譯時並不會被連接到目標代碼中,而是在程序運行是才被載入,因此在程序運行時還需要動態庫存在。
三、動態鏈接庫的特點與優勢
首先讓我們來看一下,把庫函數推遲到程序運行時期載入的好處:
1. 可以實現進程之間的資源共享。
什麼概念呢?就是說,某個程序的在運行中要調用某個動態鏈接庫函數的時候,操作系統首先會查看所有正在運行的程序,看在內存里是否已有此庫函數的拷貝了。如果有,則讓其共享那一個拷貝;只有沒有才鏈接載入。這樣的模式雖然會帶來一些「動態鏈接」額外的開銷,卻大大的節省了系統的內存資源。C的標准庫就是動態鏈接庫,也就是說系統中所有運行的程序共享著同一個C標准庫的代碼段。
2. 將一些程序升級變得簡單。用戶只需要升級動態鏈接庫,而無需重新編譯鏈接其他原有的代碼就可以完成整個程序的升級。Windows 就是一個很好的例子。
3. 甚至可以真正坐到鏈接載入完全由程序員在程序代碼中控制。
程序員在編寫程序的時候,可以明確的指明什麼時候或者什麼情況下,鏈接載入哪個動態鏈接庫函數。你可以有一個相當大的軟體,但每次運行的時候,由於不同的操作需求,只有一小部分程序被載入內存。所有的函數本著「有需求才調入」的原則,於是大大節省了系統資源。比如現在的軟體通常都能打開若干種不同類型的文件,這些讀寫操作通常都用動態鏈接庫來實現。在一次運行當中,一般只有一種類型的文件將會被打開。所以直到程序知道文件的類型以後再載入相應的讀寫函數,而不是一開始就將所有的讀寫函數都載入,然後才發覺在整個程序中根本沒有用到它們。
靜態庫:在編譯的時候載入生成目標文件,在運行時不用載入庫,在運行時對庫沒有依賴性。
動態庫:在目標文件運行時載入,手動載入,且對庫有依賴性。
具體在開發中用到哪種庫,我覺得還是根據實際的內存大小,ROM大小,運行的速度等綜合考慮。
③ 怎麼查看linux庫是使用哪個版本的編譯器編譯的
如果是你自己編譯的
那麼gcc
-v
查看本機版本號。
如果是你拿到的別人的,可以
objmp -s --section=.comment your_program查看程序編譯器版本
④ 請教關於linux中靜態庫與動態庫的問題
哈哈,簡單的來說可以按你這么理解,靜態庫就是在打包在程序裡面的,而動態庫是和程序分離開的,是程序需要的時候動態裝配進內存的。
說一下我自己的理解和經驗吧:動態庫之所以會用到,是因為有些庫會被多個程序用到,拿windows的例子來說吧,比方說你開兩個游戲,一個魔獸,一個極品飛車,這兩個都要用到activex 這個庫,如果做為動態庫,兩個程序共用一個,但是靜態庫就要分別為兩個游戲都生成庫,如果更多的話,這樣就浪費了內存很多空間。
靜態庫是和程序一起裝入內存的(其實靜態庫已經成為程序的一部分),而動態庫是動態裝入內存的,如果內存不大,又使用靜態庫,必然會發生很多的缺頁中斷,這樣效率會很低哦,你有興趣可以多多研究一下內存的一些演算法,linux kernel有現成的分頁演算法,會對你很有幫助的。
如果缺頁中斷不太明白的話可以看看操作系統的書,或者追問我,大家一起切磋交流~
⑤ linux靜態庫怎麼編譯
linux庫有動態與靜態兩種,動態通常用.so為後綴,靜態用.a為後綴。例如:libhello.so
libhello.a
為了在同一系統中使用不同版本的庫,可以在庫文件名後加上版本號為後綴,例如:
libhello.so.1.0,由於程序連接默認以.so為文件後綴名。所以為了使用這些庫,通常使用建立符號連接的方式。
ln
-s
libhello.so.1.0
libhello.so.1
ln
-s
libhello.so.1
libhello.so
動態庫和靜態庫的區別:
當要使用靜態的程序庫時,連接器會找出程序所需的函數,然後將它們拷貝到執行文件,由於這種拷貝是完整的,所以一旦連接成功,靜態程序庫也就不再需要了。然而,對動態庫而言,就不是這樣。動態庫會在執行程序內留下一個標記『指明當程序執行時,首先必須載入這個庫。由於動態庫節省空間,linux下進行連接的預設操作是首先連接動態庫,也就是說,如果同時存在靜態和動態庫,不特別指定的話,將與動態庫相連接。
兩種庫的編譯產生方法:
第一步要把源代碼編繹成目標代碼。以下面的代碼hello.c為例,生成hello庫:
/*
hello.c
*/
#include
void
sayhello()
{
printf("hello,world\n");
}
用gcc編繹該文件,在編繹時可以使用任何全法的編繹參數,例如-g加入調試代碼等:
gcc
-c
hello.c
-o
hello.o
1.連接成靜態庫
連接成靜態庫使用ar命令,其實ar是archive的意思
$ar
cqs
libhello.a
hello.o
2.連接成動態庫
生成動態庫用gcc來完成,由於可能存在多個版本,因此通常指定版本號:
$gcc
-shared
-wl,-soname,libhello.so.1
-o
libhello.so.1.0
hello.o
另外再建立兩個符號連接:
$ln
-s
libhello.so.1.0
libhello.so.1
$ln
-s
libhello.so.1
libhello.so
這樣一個libhello的動態連接庫就生成了。最重要的是傳gcc
-shared
參數使其生成是動態庫而不是普通執行程序。
-wl
表示後面的參數也就是-soname,libhello.so.1直接傳給連接器ld進行處理。實際上,每一個庫都有一個soname,當連接器發現它正在查找的程序庫中有這樣一個名稱,連接器便會將soname嵌入連結中的二進制文件內,而不是它正在運行的實際文件名,在程序執行期間,程序會查找擁有
soname名字的文件,%b
⑥ linux下的靜態庫創建與查看,及如何查看某個可執行依賴於哪些動態庫
創建靜態庫:
ar -rcs test.a *.o
查看靜態庫:
ar -tv test.a
解壓靜態庫:
ar -x test.a
查看程序依賴的動態庫:
readelf -a xxx|grep library
如:可以看到,下面的交叉程序hello執行依賴於如下兩個動態庫。
rebi@ubuntu:~/test$ arm-none-linux-gnueabi-readelf -a hello|grep "library"
0x00000001 (NEEDED) Shared library: [libgcc_s.so.1]
0x00000001 (NEEDED) Shared library: [libc.so.6]
rebi@ubuntu:~/test$
或者:readelf -l hello 即可。
nm xxx 查看符號
其中,T表示代碼段,U表示在其它地方定義,所以需要確保必須在某個.o或庫里被定義過。
⑦ 在linux環境下靜態庫(.a)的編譯和使用
假設我們自己編譯一個加法程序,和打亂信印程序。
那麼我們可以通過下面兩個命令將這兩個函數編譯成扒族靜態庫。
那麼我們可以通過下面的命令(任選一種)將main.cpp與靜態庫進行嘩此輪編譯。
待後續補充
⑧ 如何在linux操作系統下安裝gcc以及查看gcc編譯器是否安裝好
# rpm -qa|grep gcc
gcc-c++-3.4.6-3
compat-gcc-32-3.2.3-47.3
libgcc-3.4.6-3
gcc-3.4.6-3
gcc-g77-3.4.6-3
compat-libgcc-296-2.96-132.7.2
compat-gcc-32-c++-3.2.3-47.3
...
用命叢槐令 rpm -qa | grep gcc查看。
然後物鄭緩用gcc -v 查看版罩模本號,
便可知道是否已經安裝。
⑨ linux靜態庫怎麼編譯
創建並使用靜態庫
第一步:編輯源文件,test.h test.c main.c。其中main.c文件中包含main函數,作為程序入口;test.c中包含main函數中需要用到的函數。
vi test.h test.c main.c
第二步:將test.c編譯成目標文件。
gcc -c test.c
如果test.c無誤,就會得到test.o這個目標文件。
第三步:由.o文件創建靜態庫。
ar rcs libtest.a test.o
第四步:在程序中使用靜態庫。
gcc -o main main.c -L. -ltest
因為是靜態編譯,生成的執行文件可以獨立於.a文件運行。
第五步:執行。
./main
示例四 創建並使用動態庫
第一步:編輯源文件,test.h test.c main.c。其中main.c文件中包含main函數,作為程序入口;test.c中包含main函數中需要用到的函數。
vi test.h test.c main.c
第二步:將test.c編譯成目標文件。
gcc -c test.c
前面兩步與創建靜態庫一致。
第三步:由.o文件創建動態庫文件。
gcc -shared -fPIC -o libtest.so test.o
第四步:在程序中使用動態庫。
gcc -o main main.c -L. -ltest
當靜態庫和動態庫同名時,gcc命令將優先使用動態庫。
第五步:執行。
LD_LIBRARY_PATH=. ./main
示例五 查看靜態庫中的文件
[root@node56 lib]# ar -t libhycu.a
base64.c.o
binbuf.c.o
cache.c.o
chunk.c.o
codec_a.c.o