第一次用pybind11可谓是艰难险阻,主要是太多方面不懂所以碰壁重重,但最后还是靠着python的奇淫巧技挽回一成!
简单展示一下基本信息:
cpp源文件
CMakeLists文件:
网上讲pybind11用法的也不少了,但我是用MinW64进行cmake的,因此在我使用cmake时使用了了如下指令:
具体使用cmake .. 还是cmake .要看你自己的CMakeLists相较于当前cmd所在目录,这也不是什么问题。
然后是make指令编译:
也很顺利,最后出来一个:
Myproject.cpp311-win_amd64.pyd文件
pyd文件相当于.exe文件的dll文件,就是动态链接库。
我毫不犹豫在当前目录下输入python 执行指令:
import Myproject
我炒,我把问题粘贴到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文件测试单纯导入的程序返回的状态码!
程序如下:
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',然后再做移动,但无所谓了。
执行效果如下:
最后也是确定pyd文件只依赖了三个dll文件,分别是: