【发布时间】:2010-10-09 10:40:52
【问题描述】:
我一直在研究Cygwin/Mingw/lcc,我希望能够在我的 Windows 上编译 perl 本机 C 扩展(最好在 cygwin 下),然后在 Solaris 和 HP unix 上运行它们而无需任何进一步大惊小怪,这可能吗?
这一切都源于我最初的 perl 跨平台问题here。
【问题讨论】:
标签: c windows unix cross-platform cross-compiling
我一直在研究Cygwin/Mingw/lcc,我希望能够在我的 Windows 上编译 perl 本机 C 扩展(最好在 cygwin 下),然后在 Solaris 和 HP unix 上运行它们而无需任何进一步大惊小怪,这可能吗?
这一切都源于我最初的 perl 跨平台问题here。
【问题讨论】:
标签: c windows unix cross-platform cross-compiling
(这是一个非常古老的问题,但缺少一些有用的信息—— 我亲自为 Solaris(SPARC 和 x86)、AIX、HP-UX 和 Linux(x86、x64)完成了这项工作。)
交叉编译 C++ 比直接编译 C 困难得多。
不支持 HP-UX 32 位 PA-RISC,因为它使用 SOM 格式而不是 ELF,并且 binutils 不(并且可能永远不会)支持 SOM。换句话说,您只能交叉编译 64 位 PA-RISC。 (需要 PA-RISC 2.0 芯片。)
如果可以的话,我会选择 mingw 而不是 cygwin。 Cygwin 引入了许多令人头疼的文件权限问题和 cygwin1.dll 依赖关系,这些问题可能很麻烦。但是,如果可能,请在 linux 上构建。一切都会快得多,因为您运行的所有工具和脚本都是为exec 和stat 是快速操作的环境而设计的。 Windows + NTFS 不是那种环境。
从 crosstools 脚本开始,但要准备好在此花费 大量 时间。
首先尝试使用最新的 gcc/binutuils,但如果您无法解决问题,请尝试回退到较旧的软件包。例如。对于 Power3 (AIX) gcc 4.x 系列交叉编译器生成错误代码,3.x 很好。
复制本机库和头文件时,请确保您是从您可能运行的最旧的机器上复制的。复制新的 libc 意味着您的代码将无法在任何具有旧 libc 的机器上运行。
【讨论】:
交叉编译器很难设置和正常工作。
考虑一下,NetBSD 的(人员)必须投入大量工作才能让交叉编译工作,而且他们运行的是相同的操作系统,只是架构不同。
您至少必须将所有头文件从其他操作系统复制到 Windows,并为目标操作系统/架构获取交叉编译器、链接器等。
这也可能是不可能的——perl 和共享库可以使用本机/非 gcc 编译器进行编译,这在 Windows 上根本不可用。
【讨论】:
我同意Douglas 的观点,即让交叉编译器运行起来非常困难。这通常是您最后的选择。如果您正在引导或为嵌入式设备制作二进制文件,那么交叉编译通常是您唯一的选择。在考虑交叉编译之前,您应该能够在 Cygwin 下编译自己的 gcc。要交叉编译,您需要构建一个 gcc 以在 windows 下运行,但这将为您的执行平台创建二进制文件。可以在here 找到执行此操作的示例说明。
也许您想要交叉编译,因为您没有 root 和/或无法在您的目标平台上编译。例如,我有一个运行 Redhat Linux 的托管服务提供商。我可以运行 Perl CGI 脚本和相关模块,但我无法在目标机器上编译,而且我构建的库必须存在于我自己的目录中。
为了解决这个问题,我本可以尝试为我的目标平台进行交叉编译,但我决定在 Windows 上的 VM 内设置一个类似的主机。在 Cygwin 中,您可以创建一个脚本,将 ssh 放入您的虚拟机,复制您的源代码,并执行完整的配置/构建。最后一步是将二进制工件部署到我的托管系统上。
我已经成功地在 Windows 上的 VM 中运行了 Solaris 10 和 Open Solaris。不幸的是,您可能很难在 VM 下运行 HPUX。
【讨论】:
您为什么不阅读“Grand Unified Builder”(http://lilypond.org/gub/ 和 http://valentin.villenave.info/The-LilyPond-Report-11(第 4 节))
我不知道它是如何工作的,但 GUB 允许 Lilypond 开发人员在一个 linux 机器上编译大约 11 个平台。
【讨论】:
在 Windows 上编译,然后使用 Wine 在任何 *nix 上运行它们。大部分时间都运行良好。
【讨论】:
不,这在二进制级别是不可能的。各种操作系统和 CPU 在二进制级别上有很多差异。
但是您可以做的是使您的 C 扩展源兼容,以便它可以编译到不同的平台。 C 被设计为一种“可移植的汇编语言”。只要您坚持使用跨平台的例程,它们通常会以相同的方式工作。您仍然需要进行测试,因为特定平台上可能存在错误。
【讨论】:
这个做不到……但是在Solaris或者HP下重新编译代码有那么麻烦吗?
【讨论】: