delvewheel进行repair时报Unable to find library: msvcr100.dll【已解决】

问题描述

我自己编译了我下载的一个开源软件pyuvc,编译出whl文件后使用delvewheel进行repair,也就是把它依赖库dll库拷贝到whl文件中。等效的的执行命令是:

python.exe -m  delvewheel repair     -w .\wheelhouse\  dist\pupil_labs_uvc-1.0.0rc2.dev0+g9e8ea60.d20240103-cp311-cp311-win_amd64.whl --add-path  'C:\\Users\\xxxx\\AppData\\Local\\Packages\\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\\LocalCache\\local-packages\\Python311\\site-packages\\pupil_pthreads_win\\data\\lib\\x64;.\\tmp\\libjpeg-turbo-install/bin;.\\tmp\\libusb-install/libusb-1.0.26-binaries/VS2015-x64/dll'

命令行报错是:

raise FileNotFoundError(f'Unable to find library: {dll_name}')
FileNotFoundError: Unable to find library: msvcr100.dll

如何解决

网上各种修复方法,试了都不靠谱,还是下载了delvewheel源码一点点加打印分析,发现是dll和whl的CPU位宽类型不一样导致的。
我系统是64位的windows,我系统上在C:\Windows\SysWOW64这个目录下是存在msvcr100.dll这个文件的,但是它是32位的,delvewheel 把它忽略了。delvewheel 要求whl和dll的CPU位宽是一致的。如果whl是64位CPU,则要求dll也要是64位的。
解决办法就是拷贝一个64位的msvcr100.dll到–add-path 参数后面的任意一个目录下就行。

如何区分dll文件的位宽

使用二进制方式直接打开msvcr100.dll,则可以看到,64位dll中,第一个PE后面跟着一个字母d:
在这里插入图片描述

32位的dll,第一个PE后面跟着一个L:
在这里插入图片描述

delvewheel如何判断dll是否匹配

在_dll_utils.py中,find_library()函数中可以看到判断dll是否匹配的逻辑。

dll_path = None
for item in contents:
    if name == item.lower():
        path = os.path.join(directory, item)
        if os.path.isfile(path) and get_arch(path) == arch:
            dll_path = path
            break

除了判断dll的名字,还要判断dll文件的位宽是否匹配。
判断dll位宽的核心的逻辑如下(判断PE后面两个字节的内容):

def machine_field_to_type(cls, machine_field: int) -> typing.Optional['MachineType']:
        """Given the Machine field of a PE file, return the machine type or
        None if the machine type is unsupported."""
        if machine_field == 0x14c:
            return cls.I386
        if machine_field == 0x8664:
            return cls.AMD64
        if machine_field == 0xaa64:
            return cls.ARM64
        return None

可以看到,这里的类型判断和上面截图里二进制内容是对应的,PE后面跟着0x8664就是64位,跟着0x14c就是32位。当然由于是小端模式,在二进制文件中低位在前。

msvcr100.dll下载链接

我上传了一个压缩包,里面有32位和64位版本的各一个:

百度网盘链接:https://pan.baidu.com/s/129EYri6OPq990qLPU4vMKw?pwd=u913

在这里插入图片描述

参考资料

https://github.com/adang1345/delvewheel

如何判断一个dll/exe是32位还是64位?

完美解决msvcr100.dll找不到!

  • 23
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值