You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Mingw64 cc编译程序时出现NativeCommandFailed错误求助

问题解决:生成的a.exe无法运行的原因及修复

核心原因

你编译命令里加了-shared参数,这个参数是用来生成**动态链接库(DLL)**的,不是可执行程序。Windows会把生成的文件识别为DLL,而非可直接运行的EXE,所以才会弹出“不是有效OS平台应用”的错误。

修复步骤

  1. 移除编译命令中的-shared参数,重新编译:

    cc -O2 -Wall smolnes.cc -lSDL2 -g -Wno-parentheses -Wno-misleading-indentation -Wno-bool-operation
    

    编译完成后生成的a.exe就是正常的可执行程序,能够直接运行。

  2. 修复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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 00:05:26