记录第一次使用pybind11:DLL Load fail

本文讲述了作者在使用pybind11过程中遇到的困难,涉及C++与Python交互、DLL依赖问题的排查,以及如何利用os库状态码判断来找出所需的依赖文件。最终确定了一个pyd文件仅依赖三个特定的dll文件。
摘要由CSDN通过智能技术生成

第一次用pybind11可谓是艰难险阻,主要是太多方面不懂所以碰壁重重,但最后还是靠着python的奇淫巧技挽回一成!

简单展示一下基本信息:

cpp源文件

3d11508af9e340148699c56c949b57aa.png

CMakeLists文件:

26566b37267e4008b064f729c0965e6b.png 

 

网上讲pybind11用法的也不少了,但我是用MinW64进行cmake的,因此在我使用cmake时使用了了如下指令:

c6a0c46cbae14fe9b44d814481901899.png

 具体使用cmake .. 还是cmake .要看你自己的CMakeLists相较于当前cmd所在目录,这也不是什么问题。

然后是make指令编译:

f3d8c0f256974e498d612f04ca4ec81c.png

也很顺利,最后出来一个:

Myproject.cpp311-win_amd64.pyd文件

pyd文件相当于.exe文件的dll文件,就是动态链接库。

我毫不犹豫在当前目录下输入python 执行指令:

import Myproject

 d189e340c102460caaf36e101dd22e9c.png

 我炒,我把问题粘贴到github的pybind11的issue上,似乎没有相似的问题。又在bing上搜了一下,但解决方法不能照搬,唯一最有可能的情况就是我的pyd文件是依赖于其他dll文件的

我后来还将我的pyd文件粘贴到python解释器的DLLs目录下,但事实证明我的pyd文件缺失的不是python解释器中的dll文件

 

重头戏来了,我将我的c++编译器,即bin目录下的所有dll文件全部一股脑粘贴到build文件夹下,再输入python,输入命令import Myproject,导入成功!

 

事实证明,我的pyd文件缺失的正是cpp编译目录中的dll文件!但显然一股脑将全部dll文件都粘贴到文件夹下十分臃肿,显而易见的是我们的pyd文件不可能依赖那么多的dll文件!

 

怎么办呢,我后来搜索了好几个自动判断dll文件依赖项的程序,但似乎都不大好用。问ai给出的程序判断也跑不通,十分苦恼。

我们能想到的最简单的思路就是用python的os库遍历build文件夹,然后删除dll文件,再进入python导入Myproject,看是否报错

但是,如果我们只是在一个python程序中反复的import Myproject,只要开始时有一次导入成功了,后续的import一定会成功,因为python导入的库只有在程序结束时才会在内存中清空!

 

怎么办呢?美妙之处就在这里,我查询得知python的os库在cmd窗口输入指令后可以得到一个状态码!

 

这不就意味着,我们可以写两个python程序,一个单纯的导入,写一句import Myproject,另外一个python程序用来反复执行这个程序,移动dll文件测试单纯导入的程序返回的状态码!

86fae7a908f544a6bbffa71dbd258290.png

 

 

程序如下:

import os


check_folder_path = r"D:\Users\pbl\Desktop\try_pybind11\build"
for filename in os.listdir(check_folder_path):
    os.system(f"move {filename} temp")
    status = os.system("临时脚本.py")
    if status == 0:
        continue
    elif status == 1:
        os.system(fr"move temp\{filename} .")
input()

其中的临时脚本就只有一句import Myproject

temp是我在build目录下临时创建的文件夹

其时还应该加个正则或endswitch判断一下filename是不是r'.*\.dll',然后再做移动,但无所谓了。

执行效果如下:

33395409f568457093354dc0e9f3c317.png

 最后也是确定pyd文件只依赖了三个dll文件,分别是:

5a51a9d4e44e4129b9b57d62937e57d9.png

 

 

  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值