您的位置:首页 > 编程语言 > C语言/C++

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

2017-04-14 15:11 537 查看
注意:此生成的动态链接库必须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.h
int 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中,加载的路径需要指定为绝对路径。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: