1. 程式人生 > >c++呼叫c語言的so動態庫

c++呼叫c語言的so動態庫

1.環境 

ubuntu14.04  

gcc 4.8.4

g++ 4.8.4

2.庫檔案

1)原始碼

//clTest.c  
  
int add(int a, int b) {  
    return a + b;  
} 

2)生成庫檔案

cd到clTest.c所在目錄,輸入命令

gcc -shared -o libclTest.so clTest.c
會在當前目錄生成檔案libclTest.so

3.主程式

1)原始碼

//cppclTest.c
#include <stdio.h>
#include <dlfcn.h>
using namespace std;
int main() {
	typedef int(*t_add)(int a, int b);
	void *handle;
	handle = dlopen("./libclTest.so", RTLD_LAZY);
	t_add myadd = (t_add)dlsym(handle, "add");

	int result = myadd(1, 2);

	dlclose(handle);

	printf("%d\n", result);
}
2)編譯成可執行檔案

cd到cppclTest.cpp所在目錄,輸入命令

g++ cppclTest.cpp -o cppclTest -ldl
生成可執行檔案cppclTest
4.執行

cd到可執行檔案cppclTest所在目錄

輸入命令

./cppclTest

相關推薦

c++ 呼叫Python指令碼或者動態——環境Ubuntu 16.04下用codeblocks

背景:因為使用的是python版本的程式,最終要整合到C++環境的架構中,也就是說架構是c++的,交付使用者為c++的介面,但是呼叫的是python的庫,因此需要學習在c++環境下呼叫python。因為對python不熟悉,可以說有點一抹黑,因此從簡到難逐步探索。首先在c++

程式碼告訴你:Java到底是怎麼呼叫dll&so動態的?

使用Java呼叫dll&so動態庫的函式 *應用背景:專案中需要呼叫一項其他平臺提供的服務,是一位C語言老大哥寫的,可牛啦。但是因為一些特殊原因導致不能通過API呼叫的方式實現,最終的解決方案是老大哥把他的程式封裝成so和dll動態庫,然後我在專案裡使用JNA呼叫so或dll動態

Linux環境下 lua 呼叫自定義so動態(skynet)

最近看的 skynet 使用的 c+lua 的架構,框架提供的是基礎的api,所以業務邏輯還得自己去寫,如果某些業務邏輯比較耗效能,那可能就需要把某些業務邏輯丟到 c/c++ 去做,提供個介面供

c++呼叫c語言so動態

1.環境  ubuntu14.04   gcc 4.8.4 g++ 4.8.4 2.庫檔案 1)原始碼 //clTest.c int add(int a, int b) { return a + b; } 2)生成庫檔案 cd到clTest.c所

C語言呼叫so動態的兩種方式

方式1:類似靜態庫的呼叫(使用標頭檔案) 這種方式生成的程式會在啟動時候就載入so動態庫。 add.h int add(int x, int y); add.c #include "add.h" int add(int x, int y

使用JNA呼叫c/c++的so動態函式

       最近專案收到個需求,需要呼叫c寫的函式,給的是so檔案,查閱了資料,so檔案為linux下的動態庫函式檔案,windos下為dll檔案。傳統方案用JNI方式進行連線,大致看了下JNI方式實在麻煩,崩潰中找到JNA,併成功實現了呼叫,特此記錄使用過程。 一、將s

c++呼叫c++的so動態2

1.環境  ubuntu 14.04  g++ 4.8.4 2.有類的情況 1)庫檔案 a)原始碼 //cppl2.h class cal { public: cal(); virtual ~

2017.10.11 C#呼叫C++ 動態記憶體溢位問題

最近在寫C#呼叫C++ 動態庫的例子,發現使用Stringbuider 時,重複使用時容易造成記憶體溢位的問題,網上查了之後 發現可以使用 Stringbuider .Remove(0, Stringbuider .Length)方法,但是經過測試後並沒有解決問題。 後來經過仔細分析,

C#呼叫C/C++動態 封送結構體,結構體陣列

一. 結構體的傳遞 Cpp程式碼    #define JNAAPI extern "C" __declspec(dllexport) // C方式匯出函式   typedef struct       {         int osVersion;  

安卓so動態載入代理實現,可以實現C層的類反射效果

一般來說如果我們需要載入so檔案,需要一個java對應層的類,即有一個類必須要是包名和類名是不變的。 比如說下面的c層程式碼,這樣寫就必須要求有個類是com.example.hellojni.HelloJni,呼叫的方法為stringFromJNI /* DO NOT

C#呼叫C/C++動態,封裝各種複雜結構體。

    現在公司要做一個使用C#程式呼叫C++的一個DLL庫,解析檔案的功能。所以在網上找了一些資料。     一、結構體傳遞 #define JNAAPI extern "C" __declspec(dllexport) // C方式匯出函式 typedef str

C#呼叫C/C++動態連結(.dll)詳解

第一篇編譯C的動態連線庫 在實際工作中,我們經常會將C語言中的.lib和.h檔案(靜態庫)編譯成動態連線庫.dll檔案(這裡只提供這兩種檔案,沒有完整的工程),以提供給其他語言平臺呼叫。 1,必須有.lib檔案,只有.h檔案是無法編譯動態連線庫的。 2,我使用的是V

關於使用C#呼叫C++生成的動態連結(DLL檔案)

      使用C++的開啟一張圖片,C++的程式。在C++新建專案的應用設定裡面選擇DLL,圖片如下        將顯示單張圖片的C++程式碼複製到建立檔案的.CPP檔案下面,然後除錯。        程式碼如下:  // Cpp_cshape.cpp : 定義 D

Tag c++呼叫c#動態

有些時候,為了使用別人已經寫好的C#庫檔案,我們需要使用C++呼叫C#庫檔案; 以下做了一簡單的呼叫工程,步驟如下: 1、準備C#庫 (dll檔案) 第一步:單擊"檔案"---->"新建專案"---->"類圖"---->"確認"; 第二步:在類裡寫個簡單的方法; 第三步:在

C# 呼叫 C++ dll 動態連結中多個函式時全域性變數的問題

    最近編寫C#程式呼叫C++語言的演算法庫,自己嘗試在C++中封裝好DLL庫,並在一個工程檔案中同時匯出多個函式供C#呼叫。多個函式之間需要相互通訊,但又不能互相呼叫,,一個很好的方法就是用全域

C呼叫C++動態以及靜態連結

最近想在TI DM8168 上使用live555,但是Ti的程式碼都是C的,而live555是C++編寫。於是就想通過吧live555編譯為C庫,就到網上探尋方法,現在總結如下: C++ 檔案編譯庫, C++介面檔案編譯為庫,C檔案呼叫C++介面即可。 OS : Ubunt

VS2017 Linux C++引用自定義的動態

++ -1 undefined mage 編譯運行 linux下 lin 套路 log 前一篇博客講了用系統庫libpthread.so的例子,只需要在項目屬性頁的[C++->命令行參數]和[鏈接器->命令行參數]中加上對應參數(比如-pthread)即可,然後

關於 C#呼叫c,將C#的byte[]傳入C的方法和將C的char*向上傳入C#的回撥函式byte[] 的方法

需求         使用C#開發,因某種原因,寫了C庫Dll,使用C#抓圖資料傳入C,將C庫收到的圖片資料向上傳入C#回撥函式。   當前現狀         C#中將byte[]轉換成I

關於 C#呼叫CDll,有回撥函式時,只執行一次回撥函式就直接掛掉 的解決方法

錯誤         直接當機,如下圖:           錯誤原因        回撥函式宣告原因,跟堆疊有關係  

VS2017編寫純C以及使用C#呼叫C方法

原博主部落格地址:https://blog.csdn.net/qq21497936 本文章部落格地址:https://blog.csdn.net/qq21497936/article/details/83825098