1. 程式人生 > >嵌入式 C如何呼叫C++的靜態庫收集

嵌入式 C如何呼叫C++的靜態庫收集

注意:

當C呼叫C++庫的時候,有時候需要新增如下引數:

-lstdc++ 否則提示很多錯誤如“undefined reference to `__cxa_allocate_exception'

舉例:

gcc -g -o joseph_mp4 *.c -I/qy_work/a3518_v080_develop/hi_test/mp4/joseph_mp4/include -L/qy_work/a3518_v080_develop/hi_test/mp4/joseph_mp4/lib/x86/lib -lmp4v2 -lfaac -lstdc++

改C++程式,把所有要被C直接呼叫的函式都在前面加上extern "C";

C呼叫C++函式庫,一般不能直接呼叫,需要將C++庫轉換成C介面輸出,方可以使用C呼叫,看下面的例子:

  • aa.cxx

#include "add.h"
int sample::method()
{
cout<<"method is called!\n";
}

  • aa.h

#include <iostream>

using namespace std;
class sample
{
public:
int method();
};

將上面的兩個檔案生成動態庫libaa.so放到 /usr/lib目錄下,編譯命令如下

sudo g++ -fpic -shared -g -o /usr/lib/libaa.so aa.cxx -I ./

由於在C中不能識別類,所以要將上面類的成員函式封裝成C介面函式輸出,下面進行封裝,將輸出介面轉換成C介面。

  • mylib.cxx

#include "add.h"
#ifndef _cplusplus
#define _cplusplus
#include "mylib.h"
#endif

int myfunc()
{
sample ss;
ss.method();
return 0;
}

  • mylib.h

#ifdef _cplusplus
extern "C"
{
#endif

int myfunc();

#ifdef _cplusplus
}
#endif
在linux下,gcc編譯器並沒用變數_cplusplus來區分是C程式碼還是C++程式碼,如果使用gcc編譯器,這裡我們可以自己定義一個變數_cplusplus用於區分C和C++程式碼,所以在mylib.cxx中定義了一個變數_cplusplus用於識別是否需要“extern "C"”將函式介面封裝成C介面。但是如果使用g++編譯器則不需要專門定義_cplusplus,編譯命令如下:

g++ -fpic -shared -g -o mylib.so mylib.cxx -la -I ./

  • main.c

#include <stdio.h>
#include <dlfcn.h>
#include "mylib.h"

int
main()
{
int (*dlfunc)();
void *handle; //定義一個控制代碼
handle = dlopen("./mylib.so", RTLD_LAZY);//獲得庫控制代碼
dlfunc = dlsym(handle, "myfunc"); //獲得函式入口
(*dlfunc)();
dlclose(handle);

return 0;
}
編譯命令如下:

gcc -o main main.c ./mylib.so -ldl

下面就可以執行了。

需要說明的是,由於main.c 和 mylib.cxx都需要包含mylib.h,並且要將函式myfunc封裝成C介面函式輸出需要“extern "C"”,而C又不識別“extern "C"”,所以需要定義_cplusplus來區別處理mylib.h中的函式myfunc。

在main.c的main函式中直接呼叫myfunc()函式也能執行,這裡介紹的是常規呼叫庫函式的方法。

相關推薦

嵌入式 C如何呼叫C++的靜態收集

注意: 當C呼叫C++庫的時候,有時候需要新增如下引數: -lstdc++ 否則提示很多錯誤如“undefined reference to `__cxa_allocate_exception'” 舉例: gcc -g -o joseph_mp4 *.c -I/qy_wor

嵌入式C開發入門——靜態&動態

靜態庫 靜態庫,所有的庫包含在最終可執行檔案中,佔用空間大,執行速度快. 靜態庫一般以lib開頭命名,以.a字尾結尾 靜態庫的製作 1. 把所有需要的.c原始檔生成對應的.o檔案(不包括main函式) 2. 使用工具將所有.o檔案打包生成靜態庫 ar rcs lib庫名.

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

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

C呼叫C++靜態的方法

遠比想象中的簡單,其實就是兩點: 1.為C++風格的介面做一個wrapper,利用extern “C”。 2.編譯選項中加上-lstdc++ 比如說有一個庫是這樣的: ClassA.h: [c] class A { private:     int x; public:     A(int _x);    

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

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

Android-NDK學習記錄4-C呼叫Java靜態方法修改靜態欄位

一. jni互動相關-方法簽名 方法簽名在jni的使用中經常都會用到,在java中會有過載,那麼定位到一個方法的方式:類+方法名稱+方法簽名,那麼我們先學習下簽名規則: 基本型別簽名: 咱們基本型別有各自的簽名,如下表 型別名

關於 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          

C#呼叫C++的P/Invoke工具集

p/Invoke可以使用工具輔助自動生成,以減少混淆 1、官方的支援 http://visualstudiogallery.msdn.microsoft.com/site/search?query=p%2Finvoke&f%5B0%5D.Value=p%2Finvoke&f%5B0%5D.Ty

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

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

C++呼叫C#(DLL)

一、工作環境 1.平 臺:Windows 10 (64位) 2.軟體環境:VS2013 3.項 目:MFC 二、C++呼叫C#庫(DLL) 1.準備C#庫 (Dll檔案) 1.1 建立C#類庫 1.2 實現C#程式碼 //C#程式碼 using Syste

破窗理論、C++ 函式模板靜態

最近在搬磚,本以為僅僅是體力活而已,無奈自己功力不夠,處處碰壁。 這次的需求及其背景: 業務中有一個recommendId的東西,型別是string或者vector< char >。 第一個位元組(即recommendId[0])用來標識資料所

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

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

C#呼叫C++類的幾種方式

1、  直接呼叫C++類庫中的公共方法 使用DllImport特性對方法進行呼叫,比如一個C++類庫SampleCppWrapper.dll中的公共方法: extern "C" __declspec(dllexport) int __stdcall Add(int n1, int

C# 呼叫AForge類操作攝像頭

很多都是C#呼叫window API 傳送SendMessage,實現操作攝像頭,但是C#呼叫window API的時候因為驅動的問題,總是彈出視訊選擇對話方塊,讓人很是無語,看到大牛們有的截獲到了window訊息,然後模擬點選確定按鈕,這是在是不敢恭維啊,還有的大牛根據API原型重寫了,至於我是一隻IT小小

使用C#呼叫C++類

環境:win10+VS2017 過程介紹: 1.使用C++編寫一個動態庫(DLL); 2.將DLL內函式匯出; 3.使用C#進行呼叫; 4.方法呼叫; 5.在VS進行除錯; 1.使用C++編寫簡單的DLL; 1.1建立專案(x64);  在VS2017中新建->專案->Visua

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#靜態呼叫C++ dll,動態呼叫C++ dll和C++呼叫C# dll

   最近碰到有關C#呼叫MFC dll的問題,查了很多資料,參考了不少的網上部落格,做了如下總結,C#動靜態呼叫C++ dll,C++呼叫C#dll。也算一個簡單的自我整理,有問題也請提出來,共同進步。 C# 靜態調非託管C++ dll  1)C++ dll中含程式碼  

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

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