Rust/Go/Python调用C++

关于 extern "C"的作用

C++导出函数给其他语言使用必须使用C语言格式的函数,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

#ifndef __XXXX_H
#define __XXXX_H


#ifdef __cplusplus
extern "C" {
#endif

// 需要导出的C++函数
// ...

#ifdef __cplusplus
}
#endif


#endif // __XXXX_H

如何解决 C++中 class 的导出问题

因为 C++的函数只能以 C 语言的格式导出,即使用extern "C" , 那么如何处理 类方法的导出?

解决方案: 增加一个中间层(抽象层)

例如, C++的class MyData实现了细节, 那么可以增加一个 C 语言风格的结构体指针 struct Data,利用 Data 将 MyData 的方法实现封装(wrapper)

示例代码:

mydata.h:

1
2
3
4
class MyData {
//...
void doSomething();
}

mydata.cc

1
2
3
4
5
6
#include "mydata.h"
void MyData::doSomething()
{
// doSomething
}

封装抽象层: data.h

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

#ifndef __DATA_H
#define __DATA_H

#ifdef __cplusplus
extern "C" {
#endif
typedef struct Data Data;
// 导出的函数
void doSomething(Data *p);
#ifdef __cplusplus
}
#endif

#endif // __DATA_H

data.cc 对调用不可见

1
2
3
4
5
6
7
8
void doSomething(Data *p)
{
//...

// 指针类型转换, 对调用不可见
((MyData *)p)->doSomething();
}

示意图:

graph LR

Rust[Rust调用]--data.h-->data.cc[抽象层: data.cc]-.->mydata[实现层: mydata.h/mydata.cc]

Go[Go调用]--data.h-->data.cc

Python[Python调用] --data.h-->data.cc

详细代码:

https://github.com/youngqqcn/call-cpp-dylib/

  • Copyrights © 2021-2024 youngqqcn

请我喝杯咖啡吧~