Linux下編寫簡單的動態鏈結庫

2021-06-03 20:11:03 字數 2175 閱讀 4138

(1)linux下編寫動態鏈結庫。通常靜態鏈結庫是編譯的時候和原始檔一起編譯生成可執行檔案的。動態鏈結庫則不是,它是乙個已經編譯好的檔案(靜態則不是),只有當程式執行的時候(但是編譯的時候要將動態鏈結庫的資訊載入進來),它才去找動態鏈結庫拿它想用的一些函式。而且動態鏈結庫可以提高通用性,編寫乙個動態鏈結庫可以讓很多人一起用。有點類似類?

test_so.h? 12

3456

78910

11#ifndef _test_so_h

#define _test_so_h

#include

#include

voidtest_a();

voidtest_b();

voidtest_c();

#endif

test_a.c? 12

3456

#include "test_so.h"

voidtest_a()

test_b.c?

1#include"test_so.h"? 1

23

4voidtest_b()

test_c.c? 12

34

5#include "test_so.h"

voidtest_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"

intmain(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.把所有涉及到的...