Windows10不使用VS编译pybind11模块导入报DLL load failed错误如何解决
报错含义说明
这个错误不是指你生成的fun.cp39-win_amd64.pyd文件不存在,而是Windows加载该pyd模块时,找不到它依赖的其他动态链接库文件。你使用Unix Makefiles生成器在Windows下编译,大概率是用MinGW工具链,pyd默认会依赖MinGW的运行时动态库,而这些库默认不在Windows的系统搜索路径中,就会触发该报错。
解决方法
- 优先给编译加静态链接参数,修改你的CMakeLists.txt,补充静态编译配置:
cmake_minimum_required(VERSION 3.9) project(pb11Ex) # 新增静态链接配置,把运行库打包进pyd set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -static -static-libgcc -static-libstdc++") add_subdirectory(pybind11) # 注意确认这里的源文件名是否正确,你写的ex_moc.pp是否是实际的源文件名,常规C++源文件后缀为.cpp pybind11_add_module(fun, ex_moc.pp)
- 更换更适配Windows MinGW环境的CMake生成器,进入build目录后清空原有缓存,执行:
cmake .. -G "MinGW Makefiles"
之后使用mingw32-make命令代替make编译,避免工具链不匹配问题。 - 确认你运行的Python版本和架构匹配:生成的pyd是cp39-win_amd64,对应必须使用64位的Python 3.9版本,版本或架构不匹配也会触发该报错。
- 确认pyd文件在Python的搜索路径中:你可以在启动Python的同级目录放置pyd文件,或者在import前执行:
import sys; sys.path.append("你的build文件夹绝对路径") - 如果上述方法都无效,可以用Dependencies工具查看pyd的依赖项,把标红缺失的DLL(通常是MinGW目录下的
libgcc_s_seh-1.dll、libstdc++-6.dll、libwinpthread-1.dll等)复制到pyd同级目录即可。
内容的提问来源于stack exchange,提问作者Nel Carlo Bayang
相关产品推荐
相关产品推荐

