ubuntu下動態鏈結庫的編譯和使用

2021-07-24 21:40:01 字數 1513 閱讀 4332

環境:uabntu 14.04

1.設定從當前目錄下載入動態庫so檔案(ld_library_path)

linux的excutable在執行的時候預設是先搜尋/lib和/usr/lib這兩個目錄,然後按照ld.so.conf裡面的配置搜尋絕對路徑,

linux預設是不會在當前目錄搜尋動態庫的。

1、臨時修改,log out之後就失效 

在terminal中執行:export ld_library_path=./ 

2、讓當前帳號以後都優先載入當前目錄的動態庫 

在ubuntu中修改~/.profile在檔案末尾加上兩行: ld_library_path=./ 和 export ld_library_path

(而在其它linux中要修改的檔案的名稱是~/.bash_profile)

3、讓所有帳號從此都優先載入當前目錄的動態庫 

修改/etc/profile在檔案末尾加上兩行: ld_library_path=./ 和 export ld_library_path  

2.編寫makefile檔案

1. .so動態庫makefile檔案

.suffixes:.c .o

cc=gcc

srcs=test.c

objs=$(srcs:.c=.o)

exec=libtest.so 

start: $(objs)

$(cc) -shared -o $(exec) $(objs)

@echo '-----------ok-----------'

.c.o:

$(cc) -wall -g -fpic -o $@ -c $<

clean:

rm -rf $(objs)

2.執行程式makefile檔案

.suffixes:.c .o

cc=gcc

srcs=a.c

objs=$(srcs:.c=.o)

exec=a

start: $(objs)

$(cc) -o $(exec) $(objs) -l. -ltest

@echo '-----------ok-----------'

.c.o:

$(cc) -wall -g -o $@ -c $<

clean:

rm -rf $(objs)

3.make 後執行

引數詳解:

-wall:包含warning資訊

-fpic:編譯動態庫所必須的,輸出不依賴位置的**

-shared:編譯動態庫必須

-o:動態庫的名字,在這個例子裡最終生成動態庫libdllfun.so.1.0

-l.代表在當前目錄下尋找動態庫

-ltest 代表尋找的動態庫名字叫做libtest.so

test.c為動態庫libtest.so的原始檔 a.c為使用動態庫的原始檔, 其中注意在鏈結的時候,-l. 和 -ltest的順序,

如果出現鏈結出錯,動態庫中的函式未宣告,請看一下使用引數位置出錯

ubuntu下動態鏈結庫的編譯和使用例項

以下例項的環境是amd64 ubuntu10.10 g 4.4.5測試成功,在其他配置的機器上可能有一點區別。動態庫的使用方式中有兩種,第一種是類似於靜態庫的使用,另一種我稱之為真正的動態載入動態庫,主要是因為這種方式在程式執行的過程中載入鏈結庫,使用之後在解除安裝鏈結庫。先介紹第一種。在目錄 ho...

ubuntu下動態鏈結庫的編譯和使用例項

以下例項的環境是amd64 ubuntu10.10 g 4.4.5測試成功,在其他配置的機器上可能有一點區別。動態庫的使用方式中有兩種,第一種是類似於靜態庫的使用,另一種我稱之為真正的動態載入動態庫,主要是因為這種方式在程式執行的過程中載入鏈結庫,使用之後在解除安裝鏈結庫。先介紹第一種。在目錄 ho...

ubuntu下動態鏈結庫的編譯和使用例項

以下例項的環境是amd64 ubuntu10.10 g 4.4.5測試成功,在其他配置的機器上可能有一點區別。動態庫的使用方式中有兩種,第一種是類似於靜態庫的使用,另一種我稱之為真正的動態載入動態庫,主要是因為這種方式在程式執行的過程中載入鏈結庫,使用之後在解除安裝鏈結庫。先介紹第一種。在目錄 ho...