代码之家  ›  专栏  ›  技术社区  ›  goldenmean

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

  •  14
  • goldenmean  · 技术社区  · 14 年前

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

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

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

    2. 另外,我不能运行在Linux-gcc组合上生成的Linux可执行文件来在Cygwin下执行。

    任何指针都会有帮助。

    5 回复  |  直到 9 年前
        1
  •  14
  •   ak2    14 年前

    尽管谣言四起,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等价调用。

        2
  •  14
  •   Rich Homolka    14 年前

    Cygwin是一个仿真层。它允许UNIX代码在Windows上运行,如果您将其编译为使用仿真层的话。对于Windows来说,它看起来像任何普通的DLL,并且像普通的一样进行OS调用。但是当您针对它进行编译时,它显示的函数与UNIX相同(好吧,POSIX在技术上是这样的,但是UNIX是这样的)

    -mno-cygwin 标志将使二进制文件成为本机Windows二进制文件,而不是使用cygwin仿真。正如其他人所说,你也需要 -mwindows 使用cygwin gcc制作实际的GUI应用程序。

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

        3
  •  4
  •   Ahe    14 年前

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

    (一) http://www.cygwin.com/cygwin-ug-net/programming.html MinGW .

    2) 你需要一个跨海合会这样做。默认情况下,cygwin gcc生成与cygwin.dll链接的二进制文件。

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

        4
  •  4
  •   rurban    14 年前

    ad 1)cygwin目前有三种不同的mingw交叉编译器:
    gcc3-锰胞苷 已弃用。
    明W64-i686-gcc )和64位windows目标( 明W64-x86_64-gcc ).

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

    更正他人帖子中的错误:
    -mswindows 无效, -mwindows
    -mno-cygwin 仅对旧的不推荐使用的gcc3编译器有效,不再受支持。别用它。对于cygwin,应该像对待其他交叉编译器一样使用普通的主机和目标三元组。

        5
  •  2
  •   leppie    14 年前

    您需要在路径中包含cygwin.dll。