C/C++ 生成的.so文件,python 用ctypes调用

来源:互联网 发布:怎么开淘宝店 编辑:程序博客网 时间:2024/04/30 05:15

注意:此生成的动态链接库必须cdll.LoadLibrary('/home/leo/test.so'),不能直接import test,如果想直接import 调用模块,请看http://blog.csdn.net/u013378306/article/details/70172076

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

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

// test.c__declspec(dllexport) int sum(int a, int b) {    return a + b;}
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

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

// test.cpp#define DLLEXPORT extern "C" __declspec(dllexport)DLLEXPORT int sum(int a, int b) {    return a + b;}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

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

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

//test.hint sum(int, int);
  • 1
  • 2
  • 1
  • 2

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('/home/leo/test.so') >>> mydll.sum(1, 4) 5 




对于Linux,运行python,然后输入以下命令: 

>>> from ctypes import cdll >>> mydll = cdll.LoadLibrary('/home/leo/test.so') >>> mydll.sum(1, 4) 5 




值得注意的是,在Linux中,加载的路径需要指定为绝对路径。


0 0