前段時間遇到了乙個c呼叫c++的介面的問題,現在把思路整理一下。
提供給我們的是c++標頭檔案(.h)和靜態庫(.a)
c不可以直接呼叫c++,我們採用c++呼叫c++的方法,另外建乙個適配層
在我們的c++適配層中加上extern "c"
c呼叫c++適配層,適配層呼叫c++就ok了。
下面用乙個例子來說明一下:
1、模擬條件one.h,libone.a
one.h
#ifndef __one_h__
#define __one_h__
void print();
#endif
/one.cpp
#include
#include "one.h"
void print(void)
生成one.a
g++ -c one.cpp
ar -rcs libone.a one.o
one.cpp -----> libone.a
2、要呼叫c++的c函式
three.c
#include "one.h"
int main()
這樣呼叫肯定是不成功的,和我之前遇到的問題是一樣的了
請看下面的解決方法:
3、c++適配層
two.h
#ifndef __two_h__
#define __two_h__
#ifdef __cplusplus
extern "c"
#endif
#endif
/two.cpp
#include "one.h"
#include "two.h"
extern "c"
}編譯成庫
g++ -c two.cpp
ar -rcs libtwo.a two.o
two.cpp -----> libtwo.a
4、現在直接在three.c中呼叫two中的print2()就可以達到目的了。
5、需要特別說明的是,這個只是最簡單的c++的乙個函式,如果這個函式是在類中該怎麼辦呢?
我們還是本著上面的思想,把c不能識別**轉化為c可以呼叫的:
假設classname類中有個成員函式
function_in_class(char str);
這回我們的適配層就要多點東西了
標頭檔案中:typedef void *vclassname ;
原始檔中:
static vclassname classname_create_1()
static void function_in_class_c_1(vclassname thiz,char strt)
extern "c"
void function_in_class_c(vclassname thiz,char str)
}
C 如何呼叫linux so庫
中的內容 include int sum int a,int b int minus int a,int b 中的內容 using system using system.runtime.interopservices public class libtestdemo x x minus 88,42...
C 呼叫C 庫檔案
winform下呼叫dll檔案,將dll銬入bin目錄下,using system.runtime.interopservices dllimport securitymaker.dll entrypoint security make public static extern void makes...
呼叫c 呼叫C標準庫的exit函式
在common lisp中並沒有乙個叫做exit的內建函式,所以如同之前實現的 exit一樣,我會新增一種需要識別的 first expr 即符號exit。為了可以呼叫c語言標準庫中的exit函式,需要遵循呼叫約定。對於exit這種只有乙個引數的函式而言,情形比較簡單,只需要跟對 exit一樣處理即...