我正在使用Cygwin并将GCC(版本4.3.4 20090804(发布)1)安装为Cygwin软件包。
当我在Cygwin shell下使用GCC构建C代码时,生成的可执行输出文件是类型的可执行文件(用于MS Windows(控制台)Intel 80386 32位的PE32可执行文件)并且它只能在Cygwin shell下执行/运行,而不是Windows shell /命令提示符下的独立.exe。如果我尝试在Windows命令提示符下单独运行它,则会出现一个错误窗口,指出“程序无法运行,因为您的计算机缺少cygwin.dll”。
如何制作这个.exe独立版,可以在任何其他系统的命令提示符下执行,甚至可以在我自己的系统中执行?
我认为Cygwin下的GCC会构建一个Linux可执行文件(ELF 32位LSB可执行文件),但事实并非如此。如何使用gcc-cygwin组合生成* .out类型的Linux可执行文件?
另外,我无法运行在Linux-gcc组合上生成的Linux可执行文件,以便在Cygwin下执行。
任何指针都会有所帮助。
答案 0 :(得分: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替换等同物。
答案 1 :(得分:14)
Cygwin是一个仿真层。它允许UNIX代码在Windows上运行,如果您编译它以使用仿真层。对于Windows,它看起来像任何普通的DLL,并使OS调用正常。但是当你针对它进行编译时,它显示的功能与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可能要比设置它容易得多。
3)请记住,Cygwin看起来像UNIX到UNIX source
代码,而不是Linux二进制文件。一旦编译完成,函数调用就是windows DLL调用。一个cygwin程序仍然是一个Windows程序(这就是为什么你需要一个Windows风格的DLL来运行它)。 Cygwin为UNIX函数/系统调用提供代码,例如fork(),但即使调用它们的方法现在也不同。 fork()现在调用Windows DLL而不是Linux内核。它仍然是一个非常不同的系统。
答案 2 :(得分:4)
不是一个完整的答案,但我想我能够给出一些指示。
1)http://www.cygwin.com/cygwin-ug-net/programming.html表示你应该使用-mswindows参数。看看MinGW。
2)你需要一个交叉gcc才能做到这一点。默认情况下,cygwin gcc会生成与cygwin.dll链接的二进制文件。
3)因为它是linux二进制文件。最简单的方法是在cygwin中重新编译软件。
答案 3 :(得分:4)
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,您应该像使用其他所有交叉编译器一样使用普通主机和目标三元组。
答案 4 :(得分:2)
您需要在路径中使用cygwin.dll。
或者只使用MinGW编译没有依赖项的本机Windows代码。