MinGW 产生的 exe 在不同的系统上运行时会产生“与 Windows 版本不兼容”

Posted

技术标签:

【中文标题】MinGW 产生的 exe 在不同的系统上运行时会产生“与 Windows 版本不兼容”【英文标题】:MinGW produces exe which when ran on a different system produces "not compatible with the version of Windows" 【发布时间】:2014-04-06 00:11:53 【问题描述】:

计算机 A 运行 Windows 7 x64。计算机 B 运行 Windows 7 x86。我正在使用 Eclipse、Ant 和 MinGW-w64 在计算机 A 上编译文件。该文件在计算机 A 上运行良好,但在计算机 B 上出现以下错误:

此文件的版本与 Windows 的版本不兼容 你在跑。检查计算机的系统信息以查看 无论您需要 x86(32 位)还是 x64(64 位)版本的 程序,然后联系软件发行商。

程序是一个文件,main.cpp

#include <windows.h>

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)

    MessageBox(NULL, "Goodbye, cruel world!", "Note", MB_OK);
    return 0;

ant脚本如下:

<?xml version="1.0" encoding="UTF-8" ?>

<project name="winsock" default="build">
    <taskdef resource="cpptasks.tasks">
    <classpath>
      <pathelement location="E:\_dev\windows\MinGW\msys\home\windoze\projects\Winplay\lib\cpptasks.jar"/>
    </classpath>
  </taskdef>
  <taskdef resource="net/sf/antcontrib/antlib.xml">
    <classpath>
      <pathelement location="E:\_dev\windows\MinGW\msys\home\windoze\projects\Winplay\lib\ant-contrib.jar" />
    </classpath>
  </taskdef>

    <target name="build">
    <mkdir dir="build" />
    <mkdir dir="build/obj" />
    <cc name="g++" objdir="build/obj" debug="$debug">
      <fileset dir="src" includes="*.cpp" />
      <compiler name="g++">
        <compilerarg value="-std=c++11" />
      </compiler>
    </cc>

    <condition property="debugoption" value="-g -O0" else="-O2">
      <isset property="debug" />
    </condition>   
    <fileset dir="build/obj" id="objects" >
      <include name="*.o" />
    </fileset>
    <pathconvert pathsep=" " property="objectslinker" refid="objects" />  

    <!-- Due to a bug in GppLinker.java in cpptasks.jar, we must exec g++ because GppLinker erroneously uses gcc, which breaks exception handling. -->
    <exec command="g++ -std=c++11 -mwindows $debugoption -o build/winplay $objectslinker" failonerror="true" />
    </target>

    <target name="clean">
      <delete dir="build" />
    </target>
</project>

为什么 .exe 可以在我的系统上运行,但不能在具有相同 Windows 的系统上运行?我是否需要静态链接到 MinGW 使用的 Windows 定义?

【问题讨论】:

您确定计算机 B 运行的是 64 位 Windows7,而不是 32 位? 我编辑了我的帖子。实际上,计算机 B 正在运行 32 位窗口。如何编译 32 位可执行文件? 您是否在 64 位架构上运行两台计算机? x64 不能在 x86 上运行,但 x86 可以在两者上运行。 【参考方案1】:

您正在生成一个 64 位可执行文件,它与任何 32 位版本的 Windows 都不兼容(请注意,相反的情况并非如此,如果您生成了一个 32 位可执行文件,它 兼容 64 位 Windows...)

要生成 32 位版本的可执行文件,请检查 eclipse 上的“项目选项”。您必须在 antfile 和项目选项中的某处有 -march=i686。 Eclipse 可能在其界面上有一个复选框/组合框...

【讨论】:

我想是的! (你当然可以试试……) @blindsamuel 是的。检查您的 MinGW 文档以绝对确定,但我也使用 MinGW-w64 (TDM-GCC) 的版本,-m32 开关将强制它生成 32 位可执行文件。你可能也需要change to the way resource files are compiled。

以上是关于MinGW 产生的 exe 在不同的系统上运行时会产生“与 Windows 版本不兼容”的主要内容,如果未能解决你的问题,请参考以下文章

mingw能在linux上运行么

qt5.8 mingw 打包的exe要怎么在xp上运行

产生makefiles文件后,make命令不可用

win8 下qt5.8 mingw 打包的exe要怎么在xp上运行

如何使用 mingw 在代码块中的 exe 上启用 ASLR、DEP 和 SafeSEH?

如何使用 Microsoft Visual C++ 调试器调试 MinGW EXE?