linux c 動態鏈結庫so編寫

2021-07-03 02:23:22 字數 2378 閱讀 6183

linux下的動態鏈結庫是.so檔案,即:shared object,下面是乙個簡單的例子說明如何寫.so以及程式如何動態載入.so中的函式和物件。

testso.h:

#ifndef _testso_h

#define _testso_h

extern "c"

#endif // _testso_h

testso.cpp:

#include "testso.h"

extern "c"

int myadd(int a, int b)

編譯so:

g++  -shared  -fpic  -o testso.so testso.cpp
注意,-shared引數和-fpic引數非常重要:

-shared 告訴gcc要生成的是動態鏈結庫;

-fpic 告訴gcc生成的生成的**是非位置依賴的,方面的用於動態鏈結。

#include 

#include

// for dynamic library函式

#include "testso.h"

void print_usage(void)

int main(int argc, char *argv)

const char *soname = argv[1];

void *so_handle = dlopen(soname, rtld_lazy); // 載入.so檔案

if (!so_handle)

dlerror(); // 清空錯誤資訊

myadd_t *fn = (myadd_t*)dlsym(so_handle, "myadd"); // 載入函式

char *err = dlerror();

if (null != err)

printf("myadd 57 + 3 = %d/n", fn(57, 3)); // 呼叫函式

dlclose(so_handle); // 關閉so控制代碼

return 0;

}

編譯主程式:

g++ main.cpp -o main -ldl

注意:要加上-ldl

好了,上面就是如何寫和呼叫動態庫中的c函式。

對於c++中的類,不能直接匯出,需要通過繼承的方式才能從動態鏈結庫中匯出:

********************=

testso.h:

#ifndef _testso_h

#define _testso_h

// 只能通過基類呼叫,因此需要先定義乙個基類,然後在create中生成真正需要生成的物件。

class base

};class a : public base

;extern "c"

#endif // _testso_h

testso.cpp:

#include "testso.h"

int a::add(void)

extern "c"

void destory(base *p)

}

main.cpp: // 這裡需要注意

#include

#include

#include

#include "testso.h"

void print_usage(void)

int main(int argc, char *argv)

const char *soname = argv[1];

void *so_handle = dlopen(soname, rtld_lazy);

if (!so_handle)

dlerror();

create_t *create = (create_t*) dlsym(so_handle, "create");

if (null != err)

base *pa = create();

pa->a = 57;

pa->b = 3;

printf("a.add(57, 3)=%d/n", pa->add()); // 注意,這裡通過虛函式實現了

// 對a::add()的呼叫。

destory_t *destory = (destory_t*) dlsym(so_handle, "destory");

if (null != err)

destory(pa);

pa = null;

dlclose(so_handle);

printf("done!/n");

return 0;

}

編寫動態鏈結庫

很多時候我們寫 的時候會經常用到某些 段,比方說求兩個或幾個整數的和或者將乙個整形陣列轉化為二叉樹等等。經常使用這些 但是每一次又得重新再寫一遍,次數多了等於就是重複無用勞動了。所以,可以自己動手寫乙個自己的動態鏈結庫,儲存起來。下次用到只需要加上庫就ok了,這樣既方便了自己又對動態鏈結庫本身的工作...

Linux C 生成動態鏈結庫

在linux c中生成動態庫方法如下 1,測試程式 1 生成動態庫的源 檔案test.c include stdio.h int get result int firstnum,int secondnum 其介面檔案為 ifndef test h define test h int get resu...

so動態鏈結庫生成 呼叫

linux下檔案的型別是不依賴於其字尾名的,但一般來講 o,是目標檔案,相當於windows中的.obj檔案 so 為共享庫,是shared object,用於動態連線的,和dll差不多 a為靜態庫,是好多個.o合在一起,用於靜態連線 1 動態庫的編譯 下面通過乙個例子來介紹如何生成乙個動態庫。這裡...