Mingw32编译C++程序无法运行,Mingw64运行正常
确认FFmpeg库架构匹配
用Mingw32编译时必须链接32位FFmpeg库,如果误用到64位库,程序会直接崩溃,连初始化代码都跑不起来。可以通过查看库文件属性或Mingw自带的file命令,验证libavformat.a/libavdevice.a是i686架构,确保和编译器架构完全匹配。指定正确的32位编译器
避免系统默认调用Mingw64的g++,直接使用Mingw32路径下的编译器编译,比如:C:\mingw32\bin\g++ -g t.cpp -lavformat -lavdevice -o t_32.exe也可以用
where g++命令检查当前使用的编译器路径,确保是32位版本的工具链。检查运行时动态库
32位程序需要配套的32位动态库支持:FFmpeg的avformat-xx.dll、avdevice-xx.dll,还有Mingw32的运行时库(比如libstdc++-6.dll、libgcc_s_dw2-1.dll)。把这些文件放到程序同一目录,或者添加到系统的32位PATH路径中。如果双击程序无反应,打开命令提示符运行程序,会看到动态库缺失的具体错误提示。先验证Mingw32工具链本身是否正常
写一个纯32位的HelloWorld测试程序,排除工具链本身的问题:#include <iostream> int main() { std::cout << "hello world" << std::endl; return 0; }用
mingw32-g++ -g test.cpp -o test.exe编译后运行,如果这个程序都无法执行,说明Mingw32安装存在问题,需要重新安装干净的32位版本。用调试工具定位具体问题
编译时添加-v参数,查看完整的编译链接过程,确认链接的库路径和文件是否正确:mingw32-g++ -g -v t.cpp -lavformat -lavdevice用Mingw32的
gdb调试程序:运行gdb t_32.exe,输入run命令后查看崩溃时的调用栈,能直接定位到是加载哪个环节出现了问题。
内容的提问来源于stack exchange,提问作者magic

