在一些项目中,我们常常需要加载C/C++程序来完成一些底层的函数,比如Java的JVM中有native方法等,C++作为一门偏底层的语言能够完成与操作系统内核的交互,因此,本文基于Windows平台总结了Python调用C++的方法。
C程序共享库文件
首先,为了调用C++程序,我们需要理解python是如何加载C++程序的。
C++文件在其生命周期中通常有以下几种文件类型:源代码文件、头文件、预编译头文件、资源文件、编译后的目标文件、库文件、二进制可执行文件。
python调用C++程序一般通过库文件去调用,以一个简单的求和函数为例,说明从C++源文件到生成库文件的过程。
在C++代码中使用extern "C"
是为了防止C++编译器对函数名进行"名字修饰"(name mangling),以便共享库中的函数可以用C的调用约定导出。这对于与其他语言(如Python)的互操作性很重要,因为其他语言通常不理解C++的名字修饰规则。
// sum.cpp
extern "C" {
int add(int a, int b) {
return a + b;
}
}
编译指令:g++ -fPIC -shared -std=c++11 add.c -o libsum.so
,其中-fPIC
代表位置无关参数,-shared
用于指定是一个共享库。
如此编译出来的文件libsum.so
作为一个共享库就可以链接到C++程序中,你可以像这样使用这个函数。
#include <iostream>
int sum(int a, int b);
int main(){
std::cout << sum(1, 3) << std::endl;
return 0;
}
编译指令g++ main.cpp libsum.so -o test
,执行后输出4,可以发现这个共享库已经成功被我们调用。
Python程序调用
我们现在已经有libsum.so
作为链接文件,python可以通过ctypes
来调用。
import ctypes
lib = ctypes.CDLL('floor/libexample.so')
lib.add.restype = ctypes.c_int
lib.add.argtypes = [ctypes.c_int, ctypes.c_int]
result = lib.add(3, 5)
print(f"The result of add(3, 5) is: {result}")