linux 動態庫的建立和使用

2021-06-20 20:14:13 字數 1890 閱讀 1809

動態庫相比動態庫有以下優點:

由於不用靜態連線到使用庫的每個程式中,使用動態庫更節省記憶體;

公升級方便,公升級動態庫,可以不用重新編譯使用庫的程式;

注意:在x86架構下,使用動態庫可能降低效能。

》中的程式清單,只不過這次我們不生成靜態庫,而是生成動態庫。同時為了方便我們使用makefile檔案。

[plain]view plain

copy

print?

cflags=-wall -l.  

libcflags= $(cflags) -fpic  

cc=g++  

objs=main.o  

libobjs=say_hello.o say_world.o  

ar=ar rc  

library=libhelloworld.so.1.0.0  

soname=libhelloworld.so.1  

all:main  

main:$(objs) $(library)  

$(cc) $(cflags) -o $@ $(objs) -lhelloworld  

$(library):$(libobjs)  

$(cc) -shared -wl,-soname,$(soname) -o $@ $(libobjs)   

ln -sf $@ libhelloworld.so  

ln -sf $@ $(soname)  

main.o:main.cpp  

$(cc) $(cflags) -c -o $@ $<  

%.o:%.cpp  

$(cc) $(libcflags) -c -o $@ $<  

clean:  

rm -rf $(objs) $(library) $(libobjs) libhelloworld.so* main  

[cpp]view plain

copy

print?

[wayz11@linux]$ make  

g++ -wall -l. -c -o main.o main.cpp  

g++ -wall -l. -fpic -c -o say_hello.o say_hello.cpp  

g++ -wall -l. -fpic -c -o say_world.o say_world.cpp  

g++ -shared -wl,-soname,libhelloworld.so.1 -o libhelloworld.so.1.0.0 say_hello.o say_world.o   

ln -sf libhelloworld.so.1.0.0 libhelloworld.so  

ln -sf libhelloworld.so.1.0.0 libhelloworld.so.1  

g++ -wall -l. -o main main.o -lhelloworld  

我們解釋一下上面的過程:

第一行生成main.o目標檔案;

第二、三行中的-fpic選項產生位置無關**。由於動態庫是在執行的時候被調入,在編譯時,裝入記憶體的位址還不知道,因此這個選項是必須的。這兩行生成用於生成庫的目標檔案:say_hello.o和say_world.o。

第四行,-shared選項告訴編譯器生成動態庫。-wl選項使得後面的選項-soname libhelloworld.so.1被傳遞給聯結器。

第五、六行建立了兩個軟連線。

第七行生成可執行檔案。

要想在程式正常執行,我們還需要告訴系統如何(或在哪)載入我們的共享庫。

有如下兩個方法:

建立和使用動態連線庫

摘自 一 建立動態連線庫 1.建立乙個dll專案 2.新增乙個名為 mymathfuncs 的簡單類,以執行常見的算術運算,如加 減 乘和除。應與以下內容類似 示例 mathfuncsdll.h namespace mathfuncs 請注意此 方法宣告中的 declspec dllexport 修...

linux 中動態庫和靜態庫的建立和使用

靜態庫的建立 1.將.c檔案全部編譯為.o檔案 2.在linux下輸入命令 ar rcs 靜態庫名 目標檔案1 目標檔案2 靜態庫的使用 輸入命令 gcc o file file.c l.lname 備註 file表示檔名,l是搜尋路徑,l是鏈結到庫的名字 可以簡寫庫的名字 庫的名字由 lib na...

Linux下靜態庫和動態庫的建立和使用

由於windows和linux的平台不同 主要是編譯器 彙編器和聯結器的不同 因此二者庫的二進位制是不相容的 本文僅僅介紹linux系統下的庫。庫就是寫好的現有的,成熟的,可以復用的 現實中每個程式都要依賴很多基礎的底層庫,不可能每個人的 都從零開始,因此庫的存在意義非同尋常。本質上來說庫是一種可執...