Windows下EXE访问MySQL失败,错误码-1073741515求助
问题分析与解决方案
错误码说明
错误码 -1073741515(十六进制 C0000135)对应Windows的STATUS_DLL_NOT_FOUND,表明程序启动时无法找到必需的动态链接库。命令行能正常运行但PHP调用失败,核心原因是两种运行环境的PATH环境变量不一致,导致依赖的DLL无法被加载。
排查与解决步骤
1. 定位缺失的DLL
用工具明确到底是哪个DLL找不到:
- Process Monitor:设置过滤条件为
atest.exe,启动PHP调用后,查看日志中标记为NAME NOT FOUND的文件,这些就是缺失的依赖。 - Dependency Walker:直接打开
atest.exe,红色高亮的条目即为无法定位的DLL。
2. 修复MSYS2 UCRT64运行时路径问题
你的程序用MSYS2 UCRT64环境编译,依赖该环境下的UCRT运行时组件,但Apache的SYSTEM用户PATH中大概率没有C:\msys64\ucrt64\bin这个路径:
- 方法一:将
C:\msys64\ucrt64\bin下的所有必需DLL(可通过Dependency Walker确认)复制到atest.exe所在目录。 - 方法二:在Apache的
httpd.conf中添加环境变量配置,重启Apache生效:SetEnv PATH "C:\msys64\ucrt64\bin;C:\Program Files\MySQL\MySQL Server 8.0\lib;%PATH%"
3. 验证libmysql.dll的兼容性
确保你复制的libmysql.dll是64位UCRT版本:
- MySQL 8.0的官方
libmysql.dll分为不同CRT版本,若你用MSYS2 UCRT64编译,需匹配UCRT版本的库文件,避免因CRT不兼容导致加载失败。 - 可尝试从MSYS2仓库安装
mingw-w64-ucrt-x86_64-libmysqlclient,使用该环境下的libmysql.dll替换现有文件。
4. 检查程序输出捕获
PHP调用外部程序时,需确保正确捕获标准输出和错误输出:
修改PHP调用代码,同时获取stdout和stderr,比如:
$output = []; $return_var = 0; exec('atest.exe 2>&1', $output, $return_var); print_r($output); echo "Return code: $return_var";
这能帮你看到程序启动时的错误提示,进一步定位问题。
内容的提问来源于stack exchange,提问作者MichaelD
相关产品推荐
相关产品推荐

