Linux下c 通過動態鏈結庫呼叫類

2021-05-22 21:22:09 字數 2774 閱讀 1238

我的程式是乙個類,在網上找了半天,都是c的例子,c++的類封裝成靜態庫倒容易,可是如何封裝成動態庫,在其它程式中呼叫呢?

linux下的動態鏈結庫叫so,即shared object,共享物件。一些函式就不說了,網上多的是。把我遇到的問題寫下來吧

提示錯誤 undefined reference to `dlopen'

編譯時增加「-ldl」選項即可解決。

提示錯誤 cannot open shared object file: no such file or directory

將當前目錄的絕對路徑新增到ld_library_path即可

export ld_library_path=$ld_library_path:/home/zhj/test_so/

提示錯誤 undefined reference to

檢查了一下,原來在makefile裡少包含了乙個檔案。

這一類錯誤一般都是缺少相應的類檔案所致。

這個擴充套件名為hpp的檔案,我分解了一下,下面就上**吧

polygon.h

//----------

//polygon.h:

//----------

#ifndef polygon_h

#define polygon_h

#include

class polygon ;

// the types of the class factories

typedef polygon* create_t();

typedef void destroy_t(polygon*);

#endif

polygon.cpp

//----------

//polygon.cpp:

//----------

#include "polygon.h"

polygon::polygon()

polygon::~polygon()

void polygon::set_side_length(double side_length)

double polygon::area() const

********.cpp

//----------

//********.cpp:

//----------

#include "polygon.h"

#include

class ******** : public polygon

};// the class factories

extern "c" polygon* create()

extern "c" void destroy(polygon* p)

main.cpp

//----------

//main.cpp:

//----------

#include "polygon.h"

#include

#include

int main()

// reset errors

dlerror();

// load the symbols

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

const char* dlsym_error = dlerror();

if (dlsym_error)

destroy_t* destroy_******** = (destroy_t*) dlsym(********, "destroy");

dlsym_error = dlerror();

if (dlsym_error)

// create an instance of the class

polygon* poly = create_********();

// use the class

poly->set_side_length(7);

cout << "the area is: " << poly->area() << '/n';

// destroy the class

destroy_********(poly);

// unload the ******** library

dlclose(********);

}makefile

objects = main.o polygon.o

main: $(objects)

g++ -g -rdynamic -o $@ $(objects) -ldl

main.o: main.cpp

g++ -g -c main.cpp

polygon.o: polygon.cpp polygon.h

g++ -g -c polygon.cpp

.phony : clean

clean :

-rm main $(objects)

用下面的命令編譯,生成lib********.so

g++ -g -fpic -shared -o lib********.so ********.cpp polygon.cpp

然後make一下,執行main試試吧!

另: http://www.cnblogs.com/zhoutian6214/archive/2008/11/11/1331646.html

Linux下動態鏈結庫和靜態鏈結庫

第一部分 編譯過程 預處理過程,負責標頭檔案展開,巨集替換,條件編譯的選擇,刪除注釋等工作。gcc e表示進行預處理。編譯過程,負載將預處理生成的檔案,經過詞法分析,語法分析,語義分析及優化後生成彙編檔案。gcc s表示進行編譯。彙編,是將彙編 轉換為機器可執行指令的過程。通過使用gcc c或者as...

Linux下動態鏈結庫呼叫

2014 11 01 10 39 3人閱讀收藏 編輯 刪除2013 06 08 20 52 48 分類 整合開發環境相關 舉報 字型大小訂閱 linux下的靜態鏈結庫,做起來比較容易,只要將目標檔案用ar打包就可以,下面寫一下動態鏈結庫的製作和使用方法,完全是根據個人理解和經驗總結,有不對的地方還請...

linux動態鏈結庫

在做完mini6410移植全攻略後,打算把自己的linux c筆記,貼出來和大家共享,有不對支援希望大家指出,謝謝!在上篇文章中,是對靜態鏈結庫的介紹,其實有了上面的介紹動態鏈結庫的製作就簡單了,這篇來製作動態鏈結庫 建立動態鏈結庫 cpp view plain copy print?gcc sha...