IBM®
跳转到主要内容
    中国 [选择]    使用条款
 
 
Select a scope:Search for:    
    首页    产品    服务与解决方案     支持与下载    个性化服务    
跳转到主要内容

developerWorks 中国  >  Linux  >

服务器诊所: 用于交叉生成应用程序的 Xmingwin

开发可移植的不锁定专有权的应用程序

developerWorks
文档选项

未显示需要 JavaScript 的文档选项


级别: 初级

Cameron Laird (claird@phaseit.net), 副总裁

2002 年 10 月 10 日

有了 Xmingwin,就可以从 Linux 服务器生成 Windows 程序。本专栏文章提供了设置 Xmingwin 的方法,并概述了之所以这样做的最重要的几个理由。

即使是使用 C,我还是在 Linux 主机上进行大量的 Window 开发。本篇 服务器诊所专栏文章描述了如何将 mingw32-gcc source.c -o executable.exe 添加到常规的 gcc source.c -o executable 指令系统以及您为什么要这样做。

用 UNIX 自动执行操作

2002 年度最受欢迎的 服务器诊所专栏中有几篇文章解释了如何从服务器管理常见的桌面技术,包括 PDF 和 DOC 文件。从某种意义上说,这是包括 WINE、VMware 和 Linux in the Workplace在内的许多产品和书籍的目标。它们都宣称有能力从 Linux 主机复制常见的桌面技术。后面的 参考资料一节提供了这些备选方案和建议分别最适用在哪里的参考。

尽管如此,但本专栏会始终从另一个角度讨论这样的主题。本月的要点不是模拟 Windows,而是使用开发源码工具来自动生成可在 Windows 上使用的产品。Mingwin(也称为 Mingw、Mingw32 等)是 MINimalist Gnu for WINdows(用于 WINdows 的最低要求的 Gnu)的简称,这个描述很适合它。Mingwin 是一个基于 Windows 的开发套件,它大致可以和 Visual C++ 或 Borland 的 Delphi 相比拟。与后两者不同的是,Mingwin 的区别在于它提供了在 Windows 中类 UNIX 的环境。由于它基于标准 GNU 编译器 gcc,所以 Mingwin 还支持使用 C++、Fortran 以及其它紧密相关的语言。它没有提供结构复杂的集成开发环境(IDE),而它们在 Windows 开发环境中是很常见的。但是,Mingwin 拥有丰富的工具箱,其中包含健壮的实用程序,可以执行基本的开发操作:编译、链接等等。尽管所有这些操作具有一般的 UNIX 特征,但它们都很灵活并可编程。

服务器诊所为什么要采用这么“过时”的方法呢? 我经常要使用一些必须在 UNIX、Windows 以及其它 OS 下同等运行的应用程序。它可以提高我的生产率,从而能够从单一源代码集生成所有可交付的产品。例如,通过将源代码保留在 Linux 服务器上并进行自动交叉生成,我排除了“要重新引导吗?我的各个文件系统兼容吗?项目结构更改了吗?……”这整个层面的难题,而这些难题似乎会使某些开发实验室的开发速度变慢。每位开发人员对我的系统所作的更改,要么导致为所有平台生产所有可交付的产品,要么是一个显式的出错信息。这个即时反馈防止了“啊,上周我们还以为一切顺利”之类的绝大多数意外情况。

如果您也想更多地关注开发进展,而对支持平台花更少的精力,那么您会喜欢 Xmingwin。我将“Mingwin run as a cross-generating application.(Mingwin 作为一个交叉生成的应用程序运行。)”称为 Xmingwin。您应该知道:您还会看到它拼写成“cross Mingw32”、“Xmingw32”或其它变体。在写本文时未很好地对其用法标准化。请回忆:Mingwin 安装在 Windows 主机上并提供 UNIX 界面;Xmingwin“取消”了这个界面,以便其操作与 Windows 上的相同,而且它产生的输出与 Windows 准备的相同,但是是从 UNIX 安装上产生的。

安装很简单。我在这里之所以强调这一点,是因为当我首次使用 Xmingwin 时,我遇到了正确的、有点混乱的以及完全误导的各种建议。从简单步骤开始安装。要了解基本的基于 x86 的 Linux 信息,以开始您的 Xmingwin 生涯,请使用内容详尽的包(请参阅 参考资料,获取链接)。

对它解压缩并解包:

清单 1. Xmingwin 包的解包序列
      INSTALLATION=/tmp/experiment
      cd $INSTALLATION
      bunzip2 mingw-cross.tar.bz2
      tar xvf mingw-cross.tar

要开始生产性的交叉生成工作,这就足够了。尽管可能的变体一般有成千上万种,对于 Linux 开发人员工具而言它们都很标准(根据不同的优化级别进行链接、移植到另一种硬件类型的 Linux 等),但是基本的 Xmingwin 安装会让您费一番功夫。





回页首


将 Xmingwin 用于交叉生成

将分发版的 bin 目录添加到您的 PATH 。有些开发人员喜欢链接或符号链接的方案,这样,他们可以在命令提示符下输入 gcc ,并将它解析成完整路径,例如 /tmp/experiment/bin/mingw32-gcc 。 我自己的首选是让 gcc 总是意味着本机编译器,并按需显式调用或配置 mingw32-gcc

对新安装的第一个测试应该只是询问它的版本: mingw32-gcc -v 。它很可能报告类似如下信息:

gcc version 2.95.3 20010315 (release)

接着,尝试规范的“全面测试” — 编写:

清单 2. 最小的“hello, world”源代码
  
      #include <stdio.h>
      int main(int argc, char *argv[])
      {
	  puts("It works!");
      }
 

并用下列命令进行编译:

清单 3. 简单源代码的样本生成序列
       WORKING=/tmp
      INSTALLATION=/tmp/experiment
      PATH="$PATH:$INSTALLATION/bin"
      export PATH=$PATH:$INSTALLATION/bin
      cc -o $WORKING/minimal $WORKING/minimal.c
      mingw32-gcc -I$INSTALLATION/mingw32/include \
            -o $WORKING/minimal.exe $WORKING/minimal.c
 

该脚本提供了 Linux 应用程序 /tmp/minimal 及其 Windows 对应者 /tmp/minimal.exe 。将后者转移到便利的 Windows 主机,您会发现它执行时就象任何其它行为良好的 Windows 应用程序。





回页首


背景

现在讨论正题。Xmingwin/bin 目录并不只是包含交叉编译器,它还包含交叉链接器、交叉库管理器以及几乎两打用于常见开发人员操作的相关工具。有了一点实践后,您就可能从已经在使用的同样的 Makefile 中生成基于 Windows 的可交付产品,就象您目前在对 Linux 所做的那样简单。

自 1998 年 Colin Peters 创建第一个 Mingwin 编译器以来,它发展得相当快。那时,他的 gcc 版本运行在 Cygnus 环境中。随着 Jan-Jaap van der Heijden 将 Mingwin 作为本机 Windows 应用程序重新托管,并将 Mingwin 扩展成包含所有的 GNU binutil 和 make,这种发展在不断继续着;后来,Mumit Khan 扩充了这些成就,使之包含更多 Windows 独有的东西,包括更佳的 Win32api 联编。

GUI 和特定于 Win32 的功能是 Mingwin 关注的一个焦点;您可以在后面的 参考资料(特别是 Khan 的文章)中阅读有关这方面的更多信息。 服务器诊所讨论的重点是可以在 Linux 和 Windows 上工作的应用程序。我将自己的开发精力分成大致相同的两半,一半是可移植的“纯 C”,另一半是进行交叉开发的 Critcl。

Critcl 是一种吸引人的 Tcl 编程语言扩展。一开始 Critcl 为 Tcl 完成一些操作,大致相当于 Brian Ingerson 的 Inline 为 Perl 所做的:允许“外部”语言(在本例中是 C,但大体上您可以使用 SQL、汇编程序或甚至范围更广的组合)嵌入到主机语言的源代码中。这提供了许多优点,需要将来用完整的专栏文章来描述这些优点。现在的要点是 Critcl 创建者 Jean-Claude Wippler 已经充分完善了他的创建,从而使交叉生成变得简单。其结果是:无需编写 make 文件或确定链接参数,单一源代码库就足以为主机和交叉环境生成 Tcl 和 C 目标代码。Critcl 允许我自动执行并完成具有挑战性的作业,而且其速度比传统的“手工”方法快得多。





回页首


结束语

我有点跑题了:我们会在将来的专栏文章中讨论有关 Critcl 的更多问题。在此期间,我感兴趣的是 Xmingwin 为您提供的好处是否象我所获得的那么多。您的 DLL(大多数情况是特定于 Windows 的动态载入库)对您而言工作正常吗?更明确地说,只用高级的由 Linux 托管的语言(诸如 Python、Ruby、Tcl、Perl、REBOL 等)进行的开发是否按您所愿进行呢?您是否曾看到过这样一个作业:您知道 Linux 服务器要完成这个作业,但是不知道如何做,或甚至不知道使用哪种语言?请参加 Scripting 诊所论坛(单击本文顶部或底部的 讨论),分享您的经验。

感谢我的好友 Steve Landers、Rolf Ade 和 Mo DeJong 在我开始使用 XMingw32 时提供的许多帮助,我还要祝贺 MinGW 团队所取得的成功以及 MinGW 的日臻成熟。



参考资料

  • 您可以参阅本文在 developerWorks 全球站点上的 英文原文.

  • 请参加有关本文的 论坛。(您也可以单击本文顶部或底部的 讨论,访问本论坛。)

  • 请访问 MinGW -- Minimalist GNU For Windows,这是 MinGW 主页。



  • 下载 详尽的 Xmingwin 包



  • 查阅 Debian 项目,其中您可以下载 作为可安装的 Debian 软件包的 mingw32 V3.2-1



  • The Unix Guide to Defenestration”是一本描述面向 UNIX 方法的书籍,该方法用于数据中心管理。它的案例研究涉及动机和实践,这使 Mingwin 很有趣。



  • VMware是一个商业产品,它属于一种特殊的变体:在 Linux 会话内提供虚拟 Windows 主机。许多负责交叉平台的开发人员发现 VMware 非常有用,它能够在各个操作系统间共享硬件和文件系统资源。例如,一台合适的笔记本电脑可以同时表现为 Windows 和 Linux 机器。但是,VMware 特别不支持以 UNIX 风格自动执行 Windows。



  • WINE是一个存在了几乎十年的项目,它为那些要在其它操作系统(主要是 Linux )上实现的 Windows 应用程序定义了一个兼容性层。尽管 WINE 主要用于游戏和办公自动化,但是通过 WINE 使用诸如 Visual C++ 之类的 Windows 开发人员工具还是可能的。



  • CrossOver Office 是 CodeWeavers的专有 WINE 子代。



  • Win4Lin 4.0仿真的级别比 WINE 低。NeTraverse 的这个专有产品将整个 Windows95 或 Windows98 实例作为 Linux 进程进行托管。如果您乐意使用 VMware,那么您可能发现,对于常见的使用,Win4Lin 甚至会更让人满意,其许可证费用更低。



  • Nicholas Petreley 在 2000 年编写了一篇文章“ Win4lin vs. VMware”,其中深入且细致地比较了 Win4lin 和 VMware。注:自他的测试以来,Win4lin 安装已经得到了总体改进。



  • Linux in the Workplace 对 Linux 在办公自动化中作为桌面的使用在技术上作了最精确的描述。



  • CygwinMKS Inc.U/Win在本质上都是 UNIX 兼容性软件包,它们允许 UNIX 应用程序和进程在 Windows 上托管。



  • Fujitsu Nishi-Nihon Communication Systems 的技术雇员 Colin Peters创建了 Mingwin。



  • Win32 Programming with GNU C and C++”是 Peters 编写的有关 Mingwin 使用的教程,尽管它不完善但很有价值。



  • 这个 XMingw32 README解释了 XMingw32 生成和安装。



  • Inline 是一个特殊模块,它让 Perl 程序员包含用 C 或其它语言编码的功能。



  • Critcl十分类似于 Tcl,但是它扩展了接口,所以这些接口可以跨版本、操作系统以及其它边界进行工作。



  • Weave在 Python 中等同于 Inline。



  • RubyInline在 Ruby 中等同于 Inline。



  • Cameron 对 Xmingwin 的个人笔记中查找有关文档和解释的更多链接。



  • developerWorksLinux 专区查找更多 为 Linux 开发人员提供的参考资料developerWorksJava 专区还集中讨论了 交叉平台编程


关于作者

Cameron 是 Phaseit, Inc. 的全职顾问。他经常就开放源码和其它技术主题撰写文章和发表讲演。您可通过 claird@phaseit.net与 Cameron 联系。




对本文的评价

太差! (1)
需提高 (2)
一般;尚可 (3)
好文章 (4)
真棒!(5)

建议?




回页首


IBM 公司保留在 developerWorks 网站上发表的内容的著作权。未经IBM公司或原始作者的书面明确许可,请勿转载。如果您希望转载,请通过 提交转载请求表单 联系我们的编辑团队。
    关于 IBM 隐私条约 联系 IBM 使用条款