關於linux下的 a檔案與 so 檔案

2021-08-09 07:25:53 字數 2598 閱讀 2639

描述問題:使用多執行緒pthread的時候,(我用的ide,codebolcks)編譯後發現直接彈出視窗,程式還沒有被build。。巴拉巴拉,然後陷入了這個迴圈。提示有一句pthead_create未定義。

發現:pthread要用到動態鏈結庫(libpthread.a)才能使用。

解決辦法:後來在setting->complies and link->link setting裡面加入了系統中這個檔案的位址。

linux下的

.so是基於linux下的動態鏈結,其功能和作用類似與windows下.dll檔案。

下面是關於.so的介紹:

一、引言

通常情況下,對函式庫的鏈結是放在編譯時期(compile time)完成的。所有相關的物件檔案(object file)與牽涉到的函式庫(library)被鏈結合成乙個可執行檔案(executable file)。程式在執行時,與函式庫再無瓜葛,因為所有需要的函式已拷貝到自己門下。所以這些函式庫被成為靜態庫(static libaray),通常檔名為「lib***.a」的形式。

其實,我們也可以把對一些庫函式的鏈結載入推遲到程式執行的時期(runtime)。這就是如雷貫耳的動態鏈結庫(dynamic link library)技術。

二、動態鏈結庫的特點與優勢

首先讓我們來看一下,把庫函式推遲到程式執行時期載入的好處:

1. 可以實現程序之間的資源共享。

什麼概念呢?就是說,某個程式的在執行中要呼叫某個動態鏈結庫函式的時候,作業系統首先會檢視所有正在執行的程式,看在記憶體裡是否已有此庫函式的拷

貝了。如果有,則讓其共享那乙個拷貝;只有沒有才鏈結載入。這樣的模式雖然會帶來一些「動態鏈結」額外的開銷,卻大大的節省了系統的記憶體資源。c的標準庫 就是動態鏈結庫,也就是說系統中所有執行的程式共享著同乙個c標準庫的**段。

2. 將一些程式公升級變得簡單。使用者只需要公升級動態鏈結庫,而無需重新編譯鏈結其他原有的**就可以完成整個程式的公升級。windows 就是乙個很好的例子。

3. 甚至可以真正坐到鏈結載入完全由程式設計師在程式**中控制。

程式設計師在編寫程式的時候,可以明確的指明什麼時候或者什麼情況下,鏈結載入哪個動態鏈結庫函式。你可以有乙個相當大的軟體,但每次執行的時候,由於

不同的操作需求,只有一小部分程式被載入記憶體。所有的函式本著「有需求才調入」的原則,於是大大節省了系統資源。比如現在的軟體通常都能開啟若干種不同類 型的檔案,這些讀寫操作通常都用動態鏈結庫來實現。在一次執行當中,一般只有一種型別的檔案將會被開啟。所以直到程式知道檔案的型別以後再載入相應的讀寫 函式,而不是一開始就將所有的讀寫函式都載入,然後才發覺在整個程式中根本沒有用到它們。

三、動態鏈結庫的建立

由於動態鏈結庫函式的共享特性,它們不會被拷貝到可執行檔案中。在編譯的時候,編譯器只會做一些函式名之類的檢查。在程式執行的時候,被呼叫的動態

鏈結庫函式被安置在記憶體的某個地方,所有呼叫它的程式將指向這個**段。因此,這些**必須實用相對位址,而不是絕對位址。在編譯的時候,我們需要告訴編

譯器,這些物件檔案是用來做動態鏈結庫的,所以要用位址不無關**(position independent code (pic))。

對gcc編譯器,只需新增上 -fpic 標籤,如:

gcc -fpic -c file1.c

gcc -fpic -c file2.c

gcc -shared lib***.so file1.o file2.o

注意到最後一行,-shared 標籤告訴編譯器這是要建立動態鏈結庫。這與靜態鏈結庫的建立很不一樣,後者用的是 ar 命令。也注意到,動態鏈結庫的名字形式為 「lib***.so」 字尾名為 「.so」

四、動態鏈結庫的使用

a.隱式呼叫 (靜態庫與此相同的方式)

使用動態鏈結庫,首先需要在編譯期間讓編譯器檢查一些語法與定義。

這與靜態庫的實用基本一樣,用的是 -lpath 和 -l*** 標籤。如:

gcc file1.o file2.o -lpath -l*** -o program.exe

在程式執行期間,也需要告訴系統去**找你的動態鏈結庫檔案。在unix下是通過定義名為 ld_library_path 的環境變數來實現的。只需將path賦值給此變數即可。csh 命令為:

setenv ld_library_path   your/full/path/to/dll

一切安排妥當後,你可以用 ldd 命令檢查是否連線正常。

ldd program.exe

動態鏈結庫*.so的編譯與使用

b.顯示呼叫:

這種方式更加靈活。在**中需要呼叫的地方使用 #include 這個標頭檔案中的以下函式來呼叫:

linux下的 so和 a檔案

linux下的.so是基於linux下的動態鏈結,其功能和作用類似與windows下.dll檔案。下面是關於.so的介紹 一 引言 通常情況下,對函式庫的鏈結是放在編譯時期 compile time 完成的。所有相關的物件檔案 object file 與牽涉到的函式庫 library 被鏈結合成乙個...

Linux下靜態庫 a與 so庫檔案的生成與使用

靜態庫.a檔案的生成與使用。1 生成目標檔案 o 1.2 生成靜態庫.a檔案 1.3 使用.a庫檔案,建立可執行程式 若採用此種方式,需保證生成的.a檔案與.c檔案儲存在同一目錄下,即都在當前目錄下 gcc o test test.c libafile.a test 共享庫.so檔案的生成與使用 2...

關於linux中so檔案的深入認識

1 so檔案 是什麼?2 elf檔案格式 是什麼?3 mach o檔案格式 是什麼?mach o為mach object檔案格式的縮寫,它是一種用於可執行檔案,目標 動態庫,核心轉儲的檔案格式。作為a.out格式的替代,mach o提供了更強的擴充套件性,並提公升了符號表中資訊的訪問速度。mach ...