这篇小结是2016年暑假在新疆出差阶段所写,因为项目需要所以研究了一下。
如有错误,欢迎互相交流。
不同编译器实现python调用C语言动态库方法小结
- Windows平台下Visual Studio 2010编译器创建动态库,并调用
第一步:创建动态dll动态库
1打开visual studio,新建一个项目,选择Visual C++创建一个Win32 控制台应用程序,命名为test5。
2点击确定,弹出应用程序设计向导,击下一步,选择DLL,空项目,再点击完成。
3用右键点击项目test5里面的源文件,添加新建项,选择【C++文件(.cpp)】,命名为test5.c。注意:名称后面一定要加C语言文件后缀名.c。亦可用*.cpp。
4在test5.c中编写将被Python调用的函数(将一个数组按从下到大排序):
#include <stdio.h>
__declspec(dllexport)
void sort(int
{
int
"go \n");
for(i=0;i<10;i++)
{
k=i;
for(j=i+1;j<10;j++)
{
if
k=j;
t=a[k];
a[k]=a[i];
a[i]=t;
}}
"end \n");
}
///
注意:在visual studio 里面最好把所有的变量定义和说明放在函数开头,否则便会出现:【error C2143: 语法错误 : 缺少“;”(在“类型”的前面)】这类报错。这是因为纯C语言标准规定要求局部变量定义必须在函数或局部空间的开头,然后才能有其它语句。
同样的在编辑器codeblocks里面就可以不用管这些标准规定,可以很顺利地生成动态库文件。
5点击生成菜单下的生成解决方案(快捷键F7)。如果出现【error LNK1123:转换到COFF期间失败:文件无效或损坏】的报错,请将菜单栏中的【项目】→【属性】→【配置属性】→【清单工具】→【输入和输出】→【嵌入清单】:原来是“是”,改成“否”。
6在项目test5文件夹下的“Debug”目录下会生成test5.dll动态库文件。同时可以通过命令行方式运行下面命令:
gcc -Wall -shared test5.c -o test5.dll
也可以生成test5.dll动态库文件。
7如果想要生成release版的dll动态库文件,请选择菜单栏目【生成】→【配置管理器】,将项目test5的配置方式由“Debug”改为“Release”。最后点击【重新生成解决方案】,就可以在test5文件下的“Release”目录下找到relese版的dll动态库文件了。
第二步 Python 2.7调用test5.dll动态库
1将test5.dll文件拷贝到python环境变量所包含的目录里面。
2在python里面引用test.dll时,用ctypes模块里面的cdll子模块,而不是通常介绍的windll模块,具体原因暂时还不清楚。
- Gcc编译器创建动态库.so
注意windows下需要先下载MinGW安装 包(包含gcc v4.7.1编译器),然后在环境变量PATH中加入gcc编译器的执行文件的路径。但是因为我的电脑里面装有codeblocks编辑器,里面自带了MinGW,所以直接下载codeblock也行。
1先编写C语言文件;
2打开cmd管理员窗口,进入源程序C文件的指定文件夹目录下面,运行下面命令:
gcc -o test.so -shared -fPIC test.c
此时生成test.so文件,同样将该文件拷贝到python环境变量所包含的目录里面;
3.so动态库的调用和上面介绍的.dll的调用方法一样,都是导入ctypes模块中的cdll子模块。