動態庫相比動態庫有以下優點:
由於不用靜態連線到使用庫的每個程式中,使用動態庫更節省記憶體;
公升級方便,公升級動態庫,可以不用重新編譯使用庫的程式;
注意:在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系統下的庫。庫就是寫好的現有的,成熟的,可以復用的 現實中每個程式都要依賴很多基礎的底層庫,不可能每個人的 都從零開始,因此庫的存在意義非同尋常。本質上來說庫是一種可執...