環境: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...