我的程式是乙個類,在網上找了半天,都是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...