美文网首页
分析nuitka为何在win7上以onefile模式打包无法运行

分析nuitka为何在win7上以onefile模式打包无法运行

作者: 超哥__ | 来源:发表于2022-12-07 15:28 被阅读0次

    用nuitka不久,这个打包工具确实是很好的工具
    环境: Win7_x64 / nuitka1.2.x / Python3.7

    # helloworld.py
    print("helloword")
    
    python -m nuitka --onefile --mingw64 helloworld.py
    

    打包后产生helloworld.build / helloworld.dist / helloworld.onefile-build /helloworld.exe

    现象:
    运行后直接弹窗报错"helloworld.exe"已停止工作,而运行helloworld.dist/helloworld.exe却正常执行。

    一开始是怀疑缺少dll,但是把这个独立的helloworldexe放到helloworld.dist中执行,仍然报错。因此怀疑是one打包的问题。
    再次怀疑是mingw版本和win7不兼容?因此尝试切换到mingw64低版本结果依然。
    最后拿windbg调试,发现WriteFile函数使用错误,详见
    https://learn.microsoft.com/zh-cn/windows/win32/api/fileapi/nf-fileapi-writefile
    因此gitclone下载nuitka源码做如下修改

    // HelpersFilesystemPaths.c
    bool writeFileChunk(FILE_HANDLE target_file, void *chunk, size_t chunk_size) {
    #if defined(_WIN32)
        return WriteFile(target_file, chunk, (DWORD)chunk_size, NULL, NULL);
    #else
        size_t written = fwrite(chunk, 1, chunk_size, target_file);
        return written == chunk_size;
    #endif
    }
    
    // HelpersFilesystemPaths.c
    bool writeFileChunk(FILE_HANDLE target_file, void *chunk, size_t chunk_size) {
    #if defined(_WIN32)
        DWORD writesize = 0;
        return WriteFile(target_file, chunk, (DWORD)chunk_size, &writesize, NULL);
    #else
        size_t written = fwrite(chunk, 1, chunk_size, target_file);
        return written == chunk_size;
    #endif
    }
    

    再次打包,成功执行 helloworld程序

    相关文章

      网友评论

          本文标题:分析nuitka为何在win7上以onefile模式打包无法运行

          本文链接:https://www.haomeiwen.com/subject/fvowfdtx.html