linux下 o so a 檔案詳解

2021-06-16 13:54:47 字數 1487 閱讀 3613

.o、.a、.so檔案都是linux下的程式函式庫,即編譯好的可以供其他程式使用的**和資料。

優點:程式模組化,容易重新編譯,方便公升級。

分類:靜態函式庫(對應.a檔案)、共享函式庫(對應.so檔案,類似於windows的dll檔案)、動態載入函式庫(對應.o檔案,相當於windows裡的.obj檔案)

靜態函式庫

特點:實際上是簡單的普通目標檔案的集合,在程式執行前就加入到目標程式中。

優點:可以用以前某些程式相容;描述簡單;允許程式設計師把程式link起來而不用重新編譯**,節省了重新編譯**的時間(該優勢目前已不明顯);開發者可以對源**保密;理論上使用elf格式的靜態庫函式生成的**可以比使用共享或動態函式庫的程式執行速度快(大概1%-5%)

生成:使用ar程式(archiver的縮寫)。ar rcs my_lib.a f1.o f2.o是把目標**f1.o和f2.o加入到my_lib.a這個函式庫檔案中(如果my_lib.a不存在則建立)

使用:用gcc生成可執行**時,使用-l引數指定要加入的庫函式。也可以用ld命令的-l和-l引數。

共享函式庫

共享函式庫在可執行程式啟動的時候載入,所有程式重新執行時都可自動載入共享函式庫中的函式。.so檔案感覺很複雜,光是命名規則就已經看得我很暈了~整理一下,共享庫需要:soname、real name,另外編譯的時候名字也有說法。依次解釋下:

soname:必須的格式:lib+函式庫名+.so+版本號資訊(但是記住,非常底層的c庫函式都不是以lib開頭命名的)。例子:/usr/lib/libreadline.so.3

位置:共享函式庫檔案必須放在特定目錄,對於開放原始碼來說,gnu標準建議所有的函式庫檔案都放在/usr/local/lib目錄下,而且建議命令、可執行程式都放在/usr/local/bin目錄下。不過這個只是習慣啦,可以改變,具體的位置資訊可以看/etc/ld.so.conf裡面的配置資訊。當然,也可以修改這個檔案,加入自己的一些特殊的路徑要求。

建立:簡單介紹gcc方式

gcc方式:

首先建立object檔案,這個檔案將加入通過gcc –fpic 引數命令加入到共享函式庫裡面,標準格式:gcc -shared -wl,-soname,your_soname -o library_name file_list library_list(說實話這個標準格式看起來好複雜,我找了個例項,但是好像和那個標準格式稍有不同:gcc test_a.c test_b.c test_c.c -fpic -shared -o libtest.so)

更新:每次新增加動態載入的函式庫、刪除某個函式庫或者修改某個函式庫的路徑時,都要重新執行ldconfig來更新/etc/ld.so.cache

Linux下 etc fstab檔案詳解

有很多人經常修改 etc fstab檔案,但是其中卻有很多人對這個檔案所表達的意義不太清楚,因為只要按照一定的模式,就可以輕而易舉地新增一行掛載資訊,而不需要完全理解其中的原理。etc fstab是用來存放檔案系統的靜態資訊的檔案。位於 etc 目錄下,可以用命令less etc fstab 來檢視...

Linux下 etc fstab檔案詳解

有很多人經常修改 etc fstab檔案,但是其中卻有很多人對這個檔案所表達的意義不太清楚,因為只要按照一定的模式,就可以輕而易舉地新增一行掛載資訊,而不需要完全理解其中的原理。下面就讓我們來看看到底還有多少是我們不了解的。etc fstab是用來存放檔案系統的靜態資訊的檔案。位於 etc 目錄下,...

Linux下hosts檔案詳解

1 主機名 無論在區域網還是internet上,每台主機都有乙個ip位址,是為了區分此台主機和彼臺主機,也就是說ip位址就是主機的門牌號。區域網 每台機器都有乙個主機名,用於主機與主機之間的便於區分,就可以為每台機器設定主機名,以便於以容易記憶的方法來相互訪問。比如我們在區域網中可以為根據每台機器的...