python中调用用C++写的dll

Posted dennychen

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python中调用用C++写的dll相关的知识,希望对你有一定的参考价值。

    最近要逆向一个pyd文件,无意中要用到用boost库生成的pyd文件,这其中的环境配置过程很漫长,特意将配置或者说安装使用的过程记录一下。python中使用C++生成的动态库方法我知道的现在是两种,(1)通过boost库生成dll,然后改名成后缀名pyd给python使用,(2)通过python的ctypes库直接加载dll文件使用。

    先说一下第二种方式,这种比较简单,不用怎么配置环境,网上能搜到很多ctypes使用的方法,唯一需要注意的是,在32位的python使用32位的dll,64位的python中使用64位的dll,如果生成的dll在加载时老是提示找不到dll,是因为这个dll依赖于其它的dll,如果没依赖自己写的其他库,则可能是VS的环境变量没装好,配置好环境变量或者重装一遍VS。

    着重说下第一种方式,过程如下:

1) 下载boost库,下载时有压缩文件格式,也有exe格式,我使用的压缩文件格式;

2) 安装boost库:解压缩,然后通过VS的开发工具命令提示(

Win键,然后从VS程序下选择,想要生成32位的pyd文件,则选择32位的工具,如果是生成64位的pyd文件,则选择64位兼容的工具,VS2015下选择VS2015 x86 x64 兼容工具命令提示符

)来运行bootstrap.bat脚本文件,会生成bjam.exe和b2.exe,其实二者是完全一样的文件,运行其中一个即可,运行直到结束需要花至少20多分钟,64位的更长,直接运行时,会将生成的文件全部放到bjam.exe当前目录,当然也可以指定存放目录,命令如下:

x86安装则输入命令:
b2.exe --prefix=D:oostx86 --build-type=complete --build-dir=build_tmp toolset=msvc-14.0 address-model=32 install
("D:oostx86"是将要生成32位的include和lib文件夹放置的位置,build_tmp是位于安装包中用于放置中间生成物的文件夹)

x64安装则输入命令:
b2.exe --prefix=D:Boostx64 --build-type=complete --build-dir=build_tmp_x64 toolset=msvc-14.0 address-model=64 install

(msvc-14.0指的是一个平台,这里是VS2015, msvc-12.0是VS2013,什么VS版本就指定什么平台)。

3)使用配置好的boost库

    用对应版本的VS创建一个dll工程,在其中写入一些使用boost库的代码,网上很多,这里就不再记录。加入代码后,直接运行会报各种错的,因为找不到头文件和链接库,所以要在:项目——属性——C/C++——常规中的附加库目录中加入***Python36include和 ***oost_1_66_0目录,项目——属性——链接库——常规——附加库目录中加入***Python36libs 和  D:Boostx64lib(如果是直接运行b2.exe或者bjam.exe则是在当前目录的stagelib目录,如:E:Program Files (x86)oost_1_63_0stagelib)。虽然有些麻烦,但最后成功的那一下是很喜悦的。




以上是关于python中调用用C++写的dll的主要内容,如果未能解决你的问题,请参考以下文章

c++调用python系列: 结构体作为入参及返回结构体

c#调用c++写的dll,用dllimport后说啥 找不到指定模块。这个问题你是怎么解决的

如何实现js写的网页将参数传到服务器,然后服务器调用C++程序?

c++如何直接调用自己写的类中的函数,就像调用标准库中的函数那样

用c++调用python程序

如何调用自己写的python函数