如何使用C/C++为Python编写DLL/SO

开门见山,直接阐述步骤。

1. 新建一个源码文件,里面包含了返回两个整数的和的函数

如果使用C语言,新建test.c文件,并输入以下内容:

// test.c
__declspec(dllexport) int sum(int a, int b) {
    return a + b;
}

如果使用C++语言,新建test.cpp文件,并输入以下内容:

// test.cpp
#define DLLEXPORT extern "C" __declspec(dllexport)

DLLEXPORT int sum(int a, int b) {
    return a + b;
}

如果使用Windows操作系统来开发,需要使用__declspec(dllexport)的声明来说明这个函数是导出的;如果使用Linux操作系统,则这个声明省略。
extern "C"声明避免编译器对函数名称进行name mangling,这对于使用C++来编写DLL/SO是必须的。
为了提高可读性和可复用性,强烈建议使用#define来定义一个导出类型的宏,正如上面的test.cpp代码所示。

2. 新建一个头文件(但不是必须的)

//test.h
int sum(int, int);

3. 编译程序并生成DLL/SO

如果使用Windows操作系统,并安装了Visual Studio的IDE,则可以创建一个新的Win32项目,并指定为DLL类型的空项目,然后将上面新建的两个源文件包含进去。最后编译生成一个DLL,输出为test.dll
如果使用Linux操作系统,使用以下命令来生成.so:
gcc -fPIC -c test.c
gcc -shared -o test.so test.o

4. 使用ctypes来加载DLL/SO

对于Windows,进入test.dll所在目录,运行python,然后输入以下命令:
>>> from ctypes import cdll
>>> mydll = cdll.LoadLibrary('test.dll')
>>> mydll
<CDLL 'test.dll', handle 10000000 at b92310>
对于Linux,运行python,然后输入以下命令:
>>> from ctypes import cdll
>>> mydll = cdll.LoadLibrary('/home/leo/test.so')
>>> mydll
<CDLL '/home/leo/test.so', handle 9ba7d30 at b7e55d2c>
值得注意的是,在Linux中,加载的路径需要指定为绝对路径。

5. 可以使用mydll来计算两个数的和

>>> mydll.sum(1, 4)
5

参考资料

How to write a DLL/SO in C/C++ for Python

你可能感兴趣的:(c,python,dll,so,ctypes)