生成和使用動態鏈結庫和靜態鏈結庫

2021-06-19 19:23:44 字數 1261 閱讀 4914

生成和使用動態鏈結庫和靜態鏈結庫的makefile編寫

1. 概述

介紹linux下生成和使用動態鏈結庫和靜態鏈結庫的makefile的編寫方法。

2. 生成動態鏈結庫的makefile

首先要有乙個c或c++等工具編寫出來的庫函式檔案,也就是裡面寫了一堆可以被別的函式呼叫的函式。比如:

aaa.cpp

#include

void pf1(void)

void pf2(void)

接著要寫編譯這個函式的makefile

要把乙個檔案編譯成動態鏈結庫檔案需要分兩個步驟

第一步:將這個檔案編譯成.o檔案

cpp=c++

cppflags=-c

$(cpp) $(cppflags) aaa.cpp -o aaa.o

這裡是編譯cpp檔案,就用的是c++,如果是編譯.c檔案,就需要使用gcc

ld=ld

lib = libaaa.so

$(ld) -shared -o $(lib) haspapi.o

動態鏈結庫檔案的名字一定要以lib開頭,字尾是.so

編譯中一定要加上-shared,表示是生成動態鏈結庫

3. 生成靜態鏈結庫

還是使用上面的檔案,編寫makefile

同樣也是分兩步,第一步和上面一樣,我直接拷貝過來

第一步:將這個檔案編譯成.o檔案

cpp=c++

cppflags=-c

$(cpp) $(cppflags) aaa.cpp -o aaa.o

這裡是編譯cpp檔案,就用的是c++,如果是編譯.c檔案,就需要使用gcc

lib = libaaa.a

ar=ar

(ar) -r $(lib) aaa.o

靜態鏈結庫檔案的字尾是.a,同樣也是需要以lib開頭

4. 鏈結庫的使用

首先需要編寫乙個使用了鏈結庫檔案中函式的c或者c++檔案

bbb.cpp

extern void pf1(void);

extern void pf2(void);

int main(void)

$(cpp) bbb.cpp -i. -l. -o bbb.o -laaa

這裡不分是動態的還是靜態的,但是,如果使用動態鏈結庫,執行時需要將aaa.so檔案拷貝到/usr/lib下,靜態庫則不需要。

上面的例子是在redhat9上執行測試過的。

ps:由於對c++了解甚少,所以直接用c寫得c++檔案

動態鏈結庫和靜態鏈結庫

函式和資料被編譯進乙個二進位制檔案 通常擴充套件名為.lib 在使用靜態庫的情況下,在編譯鏈結可執行檔案時,鏈結器從庫中複製這些函式和資料並把它們和應用程式的其它模組組合起來建立最終的可執行檔案 exe檔案 在使用動態鏈結庫的時候,往往提供兩個檔案 乙個引入庫和乙個dll。引入庫包含被dll匯出的函...

GCC 編譯使用動態鏈結庫和靜態鏈結庫

1 庫的分類 根據鏈結時期的不同,庫又有靜態庫和動態庫之分。靜態庫是在鏈結階段被鏈結的 好像是廢話,但事實就是這樣 所以生成的可執行檔案就不受庫的影響了,即使庫被刪除了,程式依然可以成功執行。有別於靜態庫,動態庫的鏈結是在程式執行的時候被鏈結的。所以,即使程式編譯完,庫仍須保留在系統上,以供程式執行...

GCC 編譯使用動態鏈結庫和靜態鏈結庫

1 庫的分類 根據鏈結時期的不同,庫又有靜態庫和動態庫之分。靜態庫是在鏈結階段被鏈結的 好像是廢話,但事實就是這樣 所以生成的可執行檔案就不受庫的影響了,即使庫被刪除了,程式依然可以成功執行。有別於靜態庫,動態庫的鏈結是在程式執行的時候被鏈結的。所以,即使程式編譯完,庫仍須保留在系統上,以供程式執行...