在cygwin下使用GCC生成的可执行文件

在cygwin下使用GCC生成的可执行文件,gcc,cygwin,Gcc,Cygwin,我正在使用Cygwin,并将GCC(版本4.3.4 20090804(发行版)1)作为Cygwin包安装 当我在Cygwin shell下使用GCC构建C代码时,生成的可执行输出文件是一种类型的可执行文件(适用于MS Windows(控制台)的PE32可执行文件Intel 80386 32位),它只能在Cygwin shell下执行/运行,而不能在Windows shell/命令提示符下作为独立的.exe执行。如果我尝试在Windows命令提示符下独立运行它,它会出现一个错误窗口,显示“程序无法

我正在使用Cygwin,并将GCC(版本4.3.4 20090804(发行版)1)作为Cygwin包安装

当我在Cygwin shell下使用GCC构建C代码时,生成的可执行输出文件是一种类型的可执行文件(适用于MS Windows(控制台)的PE32可执行文件Intel 80386 32位),它只能在Cygwin shell下执行/运行,而不能在Windows shell/命令提示符下作为独立的.exe执行。如果我尝试在Windows命令提示符下独立运行它,它会出现一个错误窗口,显示“程序无法运行,因为您的计算机缺少cygwin.dll”

  • 如何使这个.exe独立,它可以在任何其他系统的命令提示符下执行,甚至可以在我自己的系统中执行

  • 我原以为Cygwin下的GCC会构建一个Linux可执行文件(ELF 32位LSB可执行文件),但事实并非如此。如何使用gcc-cygwin组合生成*.out类型的Linux可执行文件

  • 此外,我无法运行在Linux gcc组合上生成的Linux可执行文件,以在Cygwin下执行


  • 任何指针都会有帮助。

    您的路径中需要有cygwin.dll


    或者只使用MinGW编译没有依赖项的本机windows代码。

    尽管谣言不断,Cygwin不是Linux仿真器,也就是说,它不生成或运行Linux可执行文件。为此,您需要一个虚拟机或coLinux

    相反,Cygwin是一个兼容层,旨在在Windows中实现尽可能多的POSIX和Linux API。这意味着程序必须专门为Cygwin编译,但也意味着它更好地与Windows集成,例如,它允许您在同一程序中混合POSIX和Windows API


    是cygwin1.dll提供了兼容层。如果您使用gcc-3的-mno-Cygwin开关或某个MinGW编译器构建非Cygwin可执行文件,那么您当然不能使用任何特定于POSIX/Linux的API,任何此类调用都需要用Windows等效程序来替换。

    这不是一个完整的答案,但我想我能够给出一些提示

    1) 表示应使用-mswindows参数。看一看

    2) 要做到这一点,您需要跨gcc。默认情况下,cygwin gcc生成与cygwin.dll链接的二进制文件


    3) 这是因为它是linux二进制文件。最简单的方法是在cygwin中重新编译软件。

    cygwin是一个仿真层。它允许UNIX代码在Windows上运行,如果您将其编译为使用仿真层。对于Windows来说,它看起来像任何普通的DLL,并像普通一样进行操作系统调用。但是当您针对它进行编译时,它显示了与UNIX相同的功能(从技术上讲,POSIX是UNIX)

    1) 当您使用cygwin构建时,它会自动引入这个cygwin1.dll。这是使其看起来像UNIX所需的代码。有一些标志使其不使用此cygwin dll,这意味着忽略UNIX内容并使用本机Windows调用。
    -mno cygwin
    标志将使二进制文件成为本机Windows二进制文件,而不使用cygwin仿真。正如其他人所说,您还需要
    -mwindows
    来使用cygwin gcc制作实际的GUI应用程序

    2) 要在一个平台上编译并在另一个平台上运行,您需要所谓的交叉编译器。您还需要其他系统的库和头。为了满足您的需要,您需要一个cygwin Linux交叉编译器、Linux头文件和库。在虚拟机中运行Linux可能比设置Linux要容易得多

    3) 请记住,Cygwin对于UNIX
    source
    code,而不是Linux二进制文件,看起来就像UNIX。编译之后,函数调用就是windows DLL调用。cygwin程序仍然是Windows程序(这就是为什么需要Windows样式的DLL来运行它)。Cygwin为UNIX函数/系统调用(如fork())提供了代码,但现在甚至调用它们的方法也不同了。fork()现在调用Windows DLL,而不是Linux内核。它仍然是一个非常不同的系统。

    ad 1)目前有三种不同的mingw交叉编译器可用于cygwin:
    旧的gcc3-mno-cygwin已被弃用。
    有新的用于32位(mingw64-i686-gcc)和64位windows目标(mingw64-x86_64-gcc)的mingw64交叉编译器。
    目前还没有与官方cygwin gcc4编译器匹配的mingw-i686-gcc

    ad 2)目前还没有像cygwin包那样的linux交叉编译器。但是人们报告说他们自己成功地构建了这样一个交叉编译器

    ad 3)没有可用的cygwin交叉编译器作为linux包,但有许多mingw交叉编译器。这些mingw可执行文件也可以在cygwin下执行,尽管它们不能使用cygwin功能,只能使用简单的windows运行时

    更正他人帖子中的错误:
    -mswindows
    无效,
    -mwindows
    告诉链接器生成不带控制台的GUI应用程序。

    -mno cygwin
    仅对旧的不推荐使用的gcc3编译器有效,不再受支持。不要用它。对于cygwin,您应该像使用其他交叉编译器一样使用普通的主机和目标三元组。

    @leppie:明白了,谢谢。因此,为了使exe独立于cygwin,并在其他一些没有安装cygwin的windows系统上运行,我需要使用MingW。MingW是我的代码应该链接到的编译器还是某种库?@goldenmean:你可以尝试
    -mno cygwin
    编译器选项,但我在某处读到它已从cygwin的较新版本中删除。@Leppie:是的,当我尝试使用它时,gcc选项似乎已经消失了“gcc:mno cygwin标志已移除;使用针对mingw的交叉编译器”。谢谢。所以现在我需要在cygwin下使用mingw编译器而不是gcc,是吗?@goldenmean:我会说是的,它比cygwin(编译,而不是输出)快得多。最近还有一个易于安装的版本。请在下载页面上查找mingw get。编辑:否