歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Linux 動態庫的創建和使用

Linux 動態庫的創建和使用

日期:2017/3/1 10:00:11   编辑:Linux編程

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

由於不用靜態連接到使用庫的每個程序中,使用動態庫更節省內存;
升級方便,升級動態庫,可以不用重新編譯使用庫的程序;
注意:在x86架構下,使用動態庫可能降低性能。

創建和使用共享庫
我們使用上一篇《Linux 靜態庫的創建和使用》http://www.linuxidc.com/Linux/2013-03/81083.htm中的程序清單,只不過這次我們不生成靜態庫,而是生成動態庫。同時為了方便我們使用Makefile文件。

Makefile內容如下:

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


使用make命令編譯程序

[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被傳遞給連接器。

第五、六行創建了兩個軟連接。

第七行生成可執行文件。


使用庫
要想在程序正常運行,我們還需要告訴系統如何(或在哪)加載我們的共享庫。

有如下兩個方法:

把libhelloworld.so拷貝到/etc/ld.so.conf中列舉的任何目錄,並以root身份運行ldconfig;或者
在庫所在目錄,運行export LD_LIBRARY_PATH=`pwd`命令,把庫所在目錄加到共享庫搜索路徑中去。

Copyright © Linux教程網 All Rights Reserved