使用Mingw64 cc编译程序时出现NativeCommandFailed错误求助
问题解决:生成的a.exe无法运行的原因及修复
核心原因
你编译命令里加了-shared参数,这个参数是用来生成**动态链接库(DLL)**的,不是可执行程序。Windows会把生成的文件识别为DLL,而非可直接运行的EXE,所以才会弹出“不是有效OS平台应用”的错误。
修复步骤
移除编译命令中的
-shared参数,重新编译:cc -O2 -Wall smolnes.cc -lSDL2 -g -Wno-parentheses -Wno-misleading-indentation -Wno-bool-operation编译完成后生成的a.exe就是正常的可执行程序,能够直接运行。
修复ROM加载逻辑:你删掉的
mmap相关代码是程序加载NES ROM的核心逻辑,直接删除会导致程序无法读取游戏文件,运行后必然出错。需要替换成Windows兼容的文件读取方式,比如用标准C的文件操作函数实现,示例如下:// 替换原mmap相关代码,假设u是typedef定义的unsigned char FILE *rom_file = fopen(F[1], "rb"); if (!rom_file) { fprintf(stderr, "无法打开ROM文件: %s\n", F[1]); exit(1); } // 获取ROM文件大小 fseek(rom_file, 0, SEEK_END); long rom_size = ftell(rom_file); fseek(rom_file, 0, SEEK_SET); // 分配内存(预留16字节偏移,对应原代码的+16) u *rom_data = (u*)malloc(rom_size + 16); if (!rom_data) { fprintf(stderr, "无法为ROM分配内存\n"); fclose(rom_file); exit(1); } // 读取ROM内容到内存偏移16字节的位置 fread(rom_data + 16, 1, rom_size, rom_file); fclose(rom_file); // 赋值给全局变量(对应原代码的J[0]=q=...) J[0] = q = rom_data;
额外提示
- 确认MSYS2环境中已安装SDL2开发包(比如
mingw-w64-x86_64-SDL2),否则编译时会出现SDL2相关的链接或头文件错误。 - 运行程序时必须指定ROM文件路径,比如
./a.exe ./your_game.nes,否则程序会因找不到ROM而异常退出。
内容的提问来源于stack exchange,提问作者bytebox
相关产品推荐
相关产品推荐

