(1)linux下編寫動態鏈結庫。通常靜態鏈結庫是編譯的時候和原始檔一起編譯生成可執行檔案的。動態鏈結庫則不是,它是乙個已經編譯好的檔案(靜態則不是),只有當程式執行的時候(但是編譯的時候要將動態鏈結庫的資訊載入進來),它才去找動態鏈結庫拿它想用的一些函式。而且動態鏈結庫可以提高通用性,編寫乙個動態鏈結庫可以讓很多人一起用。有點類似類?
test_so.h? 12
3456
78910
11#ifndef _test_so_h
#define _test_so_h
#include
#include
void
test_a();
void
test_b();
void
test_c();
#endif
test_a.c? 12
3456
#include "test_so.h"
void
test_a()
test_b.c?
1#include
"test_so.h"
? 1
23
4void
test_b()
test_c.c? 12
34
5#include "test_so.h"
void
test_c()
然後將這些檔案編譯為動態鏈結庫gcc test_a.c test_b.c test_c.c --shared -fpic -o libtest.so,則生成libtest.so檔案(它已經編譯好了),和普通可執行程式不同,它並沒有main()。
在看如何呼叫它
編寫test.c? 12
3456
78
9#include "test_so.h"
int
main(
void
)
gcc test.c -l . -ltest -o test ((-l .)表示動態鏈結庫在本目錄, (-ltest)表示動態鏈結庫的名字為lib(test).so)。
然後通過ldd ./test檢視有哪些動態鏈結庫和可執行程式有關聯。
結果發現libtest.so沒有關聯。
執行./test出現:
./test: error while loading shared libraries: libtest.so: cannot open shared object file: no such file or directory
也就是說找不到這個動態鏈結庫,但是我們已經在編譯test.c的時候加入路徑了?
這時候修改ld_library_path變數? 12
3456
#vim ~/.bashrc
新增:
ld_library_path = $ld_library_path:/home/***/test
export ld_library_path
退出以後
#source ~/.bashrc
或者/etc/ld.so.conf新增動態鏈結庫的路徑。? 12
34
5#vim /etc/ld.so.conf
新增一行:/home/***/test
然後重新整理一把
#/sbin/ldconfig -v
再編譯執行成功。
Linux下編寫簡單的動態鏈結庫
linux下編寫簡單的動態鏈結庫 1 linux下編寫動態鏈結庫。通常靜態鏈結庫是編譯的時候和原始檔一起編譯生成可執行檔案的。動態鏈結庫則不是,它是乙個已經編譯好的檔案 靜態則不是 只有當程式執行的時候 但是編譯的時候要將動態鏈結庫的資訊載入進來 它才去找動態鏈結庫拿它想用的一些函式。而且動態鏈結庫...
Linux下編寫動態鏈結庫的簡單過程
1 使用編譯選項 fpic 產生與位置無關的 2 使用編譯選項 fvisibility hidden 隱藏符號 3 使用鏈結選項 shared 表示生成動態鏈結庫 4 使用鏈結選項 wl 將引數傳遞給鏈結器 5 使用鏈結選項 soname 指定庫名,注意不是庫檔名 6 保險起見,顯式鏈結 c 庫,即...
在linux下編寫動態鏈結庫的步驟
類似 windows 系統中的動態鏈結庫,linux 中也有相應的共享庫用以支援 的復用。windows 中為 dll 而linux 中為 so 我來詳細的告訴你如何在 linux 下編寫動態庫 以及如何使用它.在 linux 下編寫動態鏈結庫的步驟 1.編寫庫的標頭檔案和原始檔.2.把所有涉及到的...