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

发表于:2007-07-04来源:作者:点击数: 标签:
有了 Xmingwin,就可以从 Linux 服务器生成 Windows 程序。本专栏文章提供了设置 Xmingwin 的方法,并概述了之所以这样做的最重要的几个理由。 即使是使用 C,我还是在 Linux 主机上进行大量的 Window 开发。本篇服务器诊所专栏文章描述了如何将 mingw32-gcc

  有了 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 诊所论坛(单击本文顶部或底部的讨论),分享您的经验。

原文转自:http://www.ltesting.net