我一直在调查Cygwin / Mingw / lcc,我希望能够在我的Windows上编译perl本机C扩展(最好是在cygwin下),然后在Solaris上运行它们和HP unix没有任何进一步的大惊小怪,这可能吗?
这一切都源于我最初的perl跨平台问题here。
答案 0 :(得分:5)
交叉编译器很难设置并正常工作。
考虑到(NetBSD的人员)必须投入大量的工作才能使交叉编译工作,并且他们运行相同的操作系统,只是不同的架构。
您必须至少将所有标题从其他操作系统复制到Windows,并获得目标操作系统/体系结构的交叉编译器,链接器等。
这也许是不可能的 - perl和共享库可以使用本机/非gcc编译器编译,这在Windows上根本不可用。
答案 1 :(得分:5)
(这是一个非常古老的问题,但缺少一些有用的信息 - 我亲自为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,但如果你无法解决问题,请尝试退回旧版软件包。例如。 for Power3(AIX)gcc 4.x系列交叉编译生成错误的代码,3.x很好。
复制本机库和标题时,请确保从可能运行的最旧计算机上进行复制。复制新的libc意味着您的代码将无法在任何具有较旧libc的计算机上运行。
当复制本机库和头文件时,您可能希望'tar -h'将符号链接转换为实际文件,同时在Solaris上观察一些必需的crt目标文件隐藏在cc目录中,而不是在/ usr / lib下
答案 2 :(得分:3)
我同意Douglas,让交叉编译器工作起来非常困难。这通常是您最后的选择。如果您是引导捆绑或为嵌入式设备制作二进制文件,那么通常交叉编译是您唯一的选择。在考虑交叉编译之前,您应该在Cygwin下编译自己的gcc。要交叉编译,您需要构建一个在Windows下运行的gcc,但它将为您的执行平台创建二进制文件。可以找到执行此操作的示例说明here。
也许您想要交叉编译,因为您没有root和/或无法在目标平台上编译。例如,我有一个运行Redhat Linux的托管服务提供商。我可以运行Perl CGI脚本和相关模块,但我无法在目标机器上编译,我构建的库必须存在于我自己的目录中。
要解决这个问题,我本可以尝试为我的目标平台进行交叉编译,但我决定在Windows上的VM中设置类似的主机。在Cygwin中,您可以创建一个ssh进入VM的脚本,复制源代码,并进行完整的配置/构建。最后一步是将二进制工件部署到我的托管系统上。
我已成功在Windows上的VM中运行Solaris 10和Open Solaris。不幸的是,您可能更难在VM下运行HPUX。
答案 3 :(得分:2)
为什么不阅读“Grand Unified Builder”(http://lilypond.org/gub/和http://valentin.villenave.info/The-LilyPond-Report-11(第4节)
我不知道它是如何工作的,但GUB允许Lilypond开发人员在linux盒子上编译大约11个平台。
答案 4 :(得分:1)
在Windows上编译然后使用Wine在任何* nix上运行它们。它大部分时间都很好用。
答案 5 :(得分:-1)
不,这在二进制级别是不可能的。各种操作系统和CPU之间的二进制级别存在很多差异。
但是你可以做的是使你的C扩展源兼容,以便它可以编译到不同的平台。 C被设计为“便携式汇编语言”。只要你坚持跨平台的例程,那么它们通常会一样。您仍然需要进行测试,因为特定平台上可能存在错误。
答案 6 :(得分:-2)
这是无法做到的......但是在Solaris或HP下重新编译代码是一件很麻烦的事吗?