1. 程式人生 > >linux c/c++外掛技術:動態連結庫

linux c/c++外掛技術:動態連結庫

//----------
//main.cpp:
//----------
#include "polygon.hpp"
#include <iostream>
#include <dlfcn.h>

int main() {
    using std::cout;
    using std::cerr;

    // load the triangle library
    void* triangle = dlopen("./triangle.so", RTLD_LAZY);
    if (!triangle) {
        cerr << "Cannot load library: " << dlerror() << '\n';
        return 1;
    }

    // reset errors
    dlerror();
    
    // load the symbols
    create_t* create_triangle = (create_t*) dlsym(triangle, "create");
    const char* dlsym_error = dlerror();
    if (dlsym_error) {
        cerr << "Cannot load symbol create: " << dlsym_error << '\n';
        return 1;
    }
    
    destroy_t* destroy_triangle = (destroy_t*) dlsym(triangle, "destroy");
    dlsym_error = dlerror();
    if (dlsym_error) {
        cerr << "Cannot load symbol destroy: " << dlsym_error << '\n';
        return 1;
    }

    // create an instance of the class
    polygon* poly = create_triangle();

    // use the class
    poly->set_side_length(7);
        cout << "The area is: " << poly->area() << '\n';

    // destroy the class
    destroy_triangle(poly);

    // unload the triangle library
    dlclose(triangle);
}


//----------
//polygon.hpp:
//----------
#ifndef POLYGON_HPP
#define POLYGON_HPP

class polygon {
protected:
    double side_length_;

public:
    polygon()
        : side_length_(0) {}

    virtual ~polygon() {}

    void set_side_length(double side_length) {
        side_length_ = side_length;
    }

    virtual double area() const = 0;
};

// the types of the class factories
typedef polygon* create_t();
typedef void destroy_t(polygon*);

#endif

//----------
//triangle.cpp:
//----------
#include "polygon.hpp"
#include <cmath>

class triangle : public polygon {
public:
    virtual double area() const {
        return side_length_ * side_length_ * sqrt(3) / 2;
    }
};


// the class factories
extern "C" polygon* create() {
    return new triangle;
}

extern "C" void destroy(polygon* p) {
    delete p;
}

注意事項:

相關推薦

linux c/c++外掛技術:動態連結

//---------- //main.cpp: //---------- #include "polygon.hpp" #include <iostream> #include <dlfcn.h> int main() { using std::cout; usin

C++ 打包並呼叫動態連結 (VS2010)

相比於原始碼,動態連結庫使用起來更加方便簡潔,而且可以對原始碼起到保護作用。 生成動態連結庫 我們以vs2010為例,生成一個動態連結庫,首先在VS2010中新建一個專案,選擇“Win32控制檯應用程式“或“Win32專案”都是可以,只要在“應用程式設定”中

java呼叫C/C++生成的dll動態連結----藉助JNI

由於專案的需要,最近研究了java 呼叫DLL的方法,將如何呼叫的寫於此,便於日後查閱: 採用的方法是JNI:Java Native Interface,簡稱JNI,是Java平臺的一部分,可用於讓Java和其他語言編寫的程式碼進行互動。 下面是從網上摘取的JNI工作示意圖: 總體說明:先在JA

LuaLaTeX呼叫外部Lua程式與C語言編寫的動態連結

  在LuaLaTeX編譯方式下,雖然可以直接在tex檔案中編寫Lua程式碼,但會受到LaTeX的影響,編寫中並不是很便利。所以我在實際使用中一般都把Lua程式碼的主體部分放在LaTeX的外部,這樣可以完全按照以往的程式設計習慣去編寫。我以前所在的公司,曾經在機器人運動控制系統中使用過Lua

C#編寫和呼叫動態連結

3705.288--dll檔案是你伺服器端指令碼編譯後生成的元件,也就是說一但編譯成dll後,軟體發行後,你對應頁面的伺服器端指令碼檔案.aspx.cs就不需要釋出了,因為程式碼已經封裝在工程名.dll檔案裡了.而.pdb檔案據我理解,可能是帶上了一些資源類的檔案吧,所以檔案要比相應的dll檔案大,至於你說的

vs2010 C++建立和使用動態連結(dll)

一、用C++建立動態連結庫專案:  1、開啟Microsoft Visual Studio 2010,選擇File->New->Project。  2、在NewProject中選擇Inst

Linux下執行時呼叫動態連結.so的三種方法(筆記)

在/etc/ld.so.conf.d/下建立xxx.conf,在文字中加入.so所在路徑,如:/usr/xxx等等,然後使用相應ldconfig命令使之生效。 將.so所在路徑新增為LD_LIBRARY_PATH環境變數。 在編譯命令中使用-Wl,-rpath

Linux下使用cmake生成動態連結並使用

使用cmake生成庫主要要注意三個資料夾 (1)原始檔資料夾(2)中間資料夾(編譯生成的.o等檔案的資料夾)(3)安裝資料夾(最終可用的庫所在的資料夾) 使用庫的步驟(1)在工程檔案中包括庫函式的標頭檔案(可為絕對路徑,也可配置全域性環境變數用相對路徑)(2)在CMakeLists.txt或整合開發環境中

Linux下gcc編譯生成動態連結*.so檔案並呼叫它

動態庫*.so在linux下用c和c++程式設計時經常會碰到,最近在網站找了幾篇文章介紹動態庫的編譯和連結,總算搞懂了這個之前一直不太瞭解得東東,這裡做個筆記,也為其它正為動態庫連結庫而苦惱的兄弟們提供一點幫助。1、動態庫的編譯下面通過一個例子來介紹如何生成一個動態庫。這裡

linux下gcc編譯 .c檔案生成動態連結 .so檔案,並測試呼叫該連結

簡單介紹:linux中so檔案為共享庫,和windows下dll相似;so可以共多個程序呼叫,不同程序呼叫同一個so檔案,所使用so檔案不同;so原檔案不需要main函式;例項,1.通過mysqlTest.c中的函式mysql(),生成一個libmysql.so連結庫#inc

python中呼叫動態連結C++,linux

1,建立並編譯C++程式 #include <fstream> #include <assert.h> #include <malloc.h> #incl

Linuxc++呼叫自己編寫的matlab函式:通過mcc動態連結.so實現

之前在這裡和這裡呼叫了matlab自帶的一些函式,是通過matlab引擎來實現的。那裡呼叫的是matlab自帶的函式,那麼如果想呼叫自己寫的.m函式該怎麼辦呢?其實很簡單,原理類似,方法也不止一種。這篇筆記我先嚐試通過mcc將.m函式編譯成動態連結庫供c++呼叫的方式。在另

Linux-(C/C++)動態連結生成以及使用(libxxx.so)

Linux中so檔案為共享庫,與windows下dll類似,不過實現要簡單。 so可以供多個程序使用,不同程序呼叫同一個so檔案,所使用so檔案不同。 so檔案源程式不需要main函式,有也不會被執行。 下面通過一個簡單例子,來學習.so檔案的製作跟使用(前提已經配置好環

Linux動態連結的建立和使用及C呼叫matlab動態問題

其實這個資料網路上已經很多了,但是還是有一些細節讓我搗鼓了很久,以及最近在做matlab mcc做成so檔案供給c++呼叫的時候的一些問題。 一、首先如何製作Linux下的so 檔案 【1】http://bbs.chinaunix.net/thread-1281954-1-

Linux環境下使用eclipse開發C++動態連結程式

Linux中也有類似windows中DLL的變成方法,只不過名稱不同而已。在Linux中,動態連結叫做Standard Object,生成的動態連結檔案為*.so。詳細請參考相關文件。 開發環境:Eclipse 3.4.2 G++:4.3.2 1. 建立動態連結庫

C++】linux下CMake生成動態連結,g++包含生成動態連結

一、前言   由於專案中要用到java呼叫C++的庫檔案,於是需要在linux下編譯連線生成動態庫,然後根據Recast官方包要先CMake生成編譯,然後在包含到自己實現的檔案,網上查了半天,坑爹沒有全面的,東拼西湊終於才明白原理,於是總結記錄分享如下。 二、CMake生

C語言函式動態連結與靜態連結

首先,函式庫就是一些事先寫好的函式的集合,是別人分享的,我們可以拿來使用的。經過一些校準和整理,就形成一份標準化的函式庫。例如glibc 函式庫有兩種提供形式:動態連結庫與靜態連結庫 早起函式庫裡的函式都是直接共享的,就是所謂的開源社群。後來函式庫商業化,就出現了靜態連結庫與動態連結庫。

python中呼叫 C#動態連結問題記錄

程式[摘自https://blog.csdn.net/LTG01/article/details/80700513]  import clr clr.FindAssembly("PythonNetTest.dll") ## 載入c#dll檔案 from PythonNetTest import *

使用Netbeans編譯C++檔案,動態連結的方法

一鍵執行時會出現類似於下面的錯誤: Undefined symbols for architecture x86_64:   "___gmp_printf", referenced from:       _main in main.o   "_

C#生成/呼叫動態連結

參考地址:https://www.cnblogs.com/qq4004229/archive/2013/01/30/2882409.html   一、需求描述   (1)用程式碼生成動態連結庫   (2)用C#程式碼呼叫動態連結庫 二、生成動態連結庫   (