链接Caffe,程序报错应用程序无法正常启动(0xc000007b)
重点是介绍了一种排查这个问题的方法。
背景
- Windows 下, Caffe 单独编译成库并且安装在路径 Caffe_DIR, 动态链接库 Caffe_DIR/bin 已经加入环境变量了
- Run_DIR/main.exe 是一个链接了 Caffe lib 的程序,在运行的时候报错 “ 应用程序无法正常启动(0xc000007b),请单击“确定”关闭应用程序 ”
Debug
-
把 main.exe 复制到 Caffe_DIR/bin 中(和一堆dll放一起),双击运行,嗯?可以跑;这说明问题出在没有找到必要的.dll,但是我明明把Caffe_DIR 加入环境变量并且重启过啊,不明所以,继续试验
-
把 Caffe_DIR/bin 里面所有.dll 复制到原先的main.exe 所在目录Run_DIR,双击 main.exe,可以跑,确定问题就出在这堆 .dll中
-
(前提是 Caffe_DIR/bin 已经在环境变量中)逐个删除Run_DIR里的.dll文件,每删除一个就 运行一下 main.exe,直到在删除 libgcc_s_seh-1.dll 之前都可以运行(这也证明了我们之前加入环境变量中确实生效了)。所以问题就出在 libgcc_s_seh-1.dll 链接库上,这个是caffe的依赖 openblas 带来的。虽然它的路径已经被添加到环境变量中,但是不知道为什么没有生效。
解决办法
把 libgcc_s_seh-1.dll
这个dll 文件放在 main.exe 的路径下就可以了,它将被优先找到。
原因(猜想)
因为时间原因没有深入挖掘,但是我认为最有可能的原因是,在我的电脑里有多个 libgcc_s_seh-1.dll
文件,在main.exe 装载的时候先找到了另外一个版本的 同名的.dll, 真假孙悟空,假悟空让我取不了真经; 如果只是相应的库没有找到,按照经验windows 都会报错缺少 "xxxx.dll"。
全局搜索了一下电脑,发现叫 libgcc_s_seh-1.dll
的文件可真多啊。
总结
主要记录了一次BUG的排查过程,主要思想是先找到对的,再去控制变量,执果索因找到不对的。 因为感觉这个问题很有可能会再次遇到,所以先记录下来,也分享给大家。