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 版本不兼容”的主要内容,如果未能解决你的问题,请参考以下文章