5

我一直在研究Cygwin / Mingw / lcc,我希望能够在我的 Windows 上编译 perl 本机 C 扩展(最好在 cygwin 下),然后在 Solaris 和 HP unix 上运行它们而无需大惊小怪,这可能吗?

这一切都源于我最初的 perl cross-platform question here

4

7 回答 7

6

(这是一个非常古老的问题,但缺少一些有用的信息——我亲自为 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而设计的。statWindows + NTFS 不是那种环境。

  • 从 crosstools 脚本开始,但要准备好在这上面花费大量时间。

  • 首先尝试使用最新的 gcc/binutuils,但如果您无法解决问题,请尝试回退到较旧的软件包。例如对于 Power3 (AIX) gcc 4.x 系列交叉编译器生成错误代码,3.x 很好。

  • 复制本机库和标头时,请确保您是从您可能运行的最旧的机器上复制的。复制新的 libc 意味着您的代码不会在任何具有旧 libc 的机器上运行。

  • 复制本机库和头文件时,您可能希望 'tar -h' 将符号链接转换为实际文件,还要注意在 Solaris 上,一些必需的 crt 对象文件被埋在 cc 目录中,而不是 /usr/lib 下

于 2010-02-03T22:11:51.607 回答
5

交叉编译器很难设置和正常工作。

考虑一下 NetBSD 的(人员)必须投入大量工作才能使交叉编译工作,而且他们运行的是相同的操作系统,只是架构不同。

您至少必须将所有头文件从其他操作系统复制到 Windows,并为目标操作系统/架构获取交叉编译器、链接器等。

这也很可能是不可能的——perl 和共享库可以用本机/非 gcc 编译器编译,这在 Windows 上根本不可用。

于 2009-02-23T22:59:18.517 回答
3

我同意Douglas的观点,让一个交叉编译器运行起来非常困难。这通常是您最后的选择。如果您正在引导或为嵌入式设备制作二进制文件,那么交叉编译通常是您唯一的选择。在考虑交叉编译之前,您应该能够在 Cygwin 下编译自己的 gcc。要交叉编译,您需要构建一个 gcc 以在 windows 下运行,但这将为您的执行平台创建二进制文件。可以在此处找到执行此操作的示例说明。

也许您想要交叉编译,因为您没有 root 和/或无法在您的目标平台上编译。例如,我有一个运行 Redhat Linux 的托管服务提供商。我可以运行 Perl CGI 脚本和相关模块,但我无法在目标机器上编译,而且我构建的库必须存在于我自己的目录中。

为了解决这个问题,我本可以尝试为我的目标平台进行交叉编译,但我决定在 Windows 上的 VM 中设置一个类似的主机。在 Cygwin 中,您可以创建一个脚本,将 ssh 放入您的虚拟机,复制您的源代码,并执行完整的配置/构建。最后一步是将二进制工件部署到我的托管系统上。

我已经成功地在 Windows 上的 VM 中运行了 Solaris 10 和 Open Solaris。不幸的是,您可能很难在 VM 下运行 HPUX。

于 2009-05-28T23:44:50.520 回答
2

为什么不阅读“Grand Unified Builder”(http://lilypond.org/gub/http://valentin.villenave.info/The-LilyPond-Report-11(第 4 节))

我不知道它是如何工作的,但是 GUB 允许 Lilypond 开发人员在一个 linux 机器上编译大约 11 个平台。

于 2009-05-29T00:06:24.097 回答
1

在 Windows 上编译,然后使用 Wine 在任何 *nix 上运行它们。它大部分时间都运行良好。

于 2009-02-24T14:04:18.620 回答
-1

不,这在二进制级别是不可能的。各种操作系统和 CPU 在二进制级别上有很多差异。

但是您可以做的是使您的 C 扩展源兼容,以便它可以编译到不同的平台。C 被设计为一种“可移植的汇编语言”。只要您坚持使用跨平台的例程,它们通常会以相同的方式工作。您仍然需要进行测试,因为特定平台上可能存在错误。

于 2009-02-23T22:53:42.927 回答
-2

这无法做到……但是在 Solaris 或 HP 下重新编译代码有那么麻烦吗?

于 2009-02-23T22:55:21.690 回答