如何编译 D-Phoenix 库
近日有朋友问及如何编译和使用 D-Phoenix 库。于是就有了这篇文章的存在。
这个年代,没有 IDE 进行编码编译是痛苦的。所以,博主将主要介绍使用 Poseidon 来编译 D-Phoenix 库(为啥子要讲 Poseidon,而不是 CodeBlocks 之类的 IDE。哈,因为 Poseidon 是国产货)。
首先,D 语言编译器是必备武器。D-Phoenix 库推荐使用 DMD 2.019 for Win32编译器。你可以按照下面的方法安置好 D 语言编译器:
- 从 http://ftp.digitalmars.com/dmc.zip 处获得 DMC Linker & Utilities for Win32,并解压缩到 C:\ 根目录下。
- 从 http://ftp.digitalmars.com/dmd.2.019.zip 处获得 DMD 2.019 编译器,并解压缩到 C:\ 根目录下。
然后,从 http://www.dsource.org/projects/poseidon/changeset/head/trunk?old_path=%2F&format=zip 处获得最新版 Poseidon IDE。
接下来,在你指定的位置新建文件夹 d-phoenix 。然后从 http://d-phoenix.googlecode.com/files/Phoenix%20v0.5.1.zip 处下载 D-Phoenix 源码,并解压缩到刚才新建的 d-phoenix 目录下。当然,你也可以从 http://d-phoenix.googlecode.com/svn/trunk/ 处使用 SVN 检出。如图 1 所示:
检出完毕之后,可以如图 2 所示的目录结构:
这时,打开刚才下载的 Poseidon IDE,从 File 菜单下选择 New Project,这时会弹出 Project Property 窗口。如图 3 所示:
现在开始设置项目属性:
- 在 Load Style 上,选择 By Project Path。
- 在 Project Name 上填写 D-Phoenix。
- 在 Project Path 上选择我们刚刚的 d-phoenix\source 目录。
- 在 Type 上选择 Static Library。其实这里选择什么都无所谓,因为编译时不会用到这个选项,后面会讲到。
- 其他选项,我们不用去管。
设置好之后,你会看到如图 4 所示的结果:
这样,就创建了 D-Phoenix 项目。但是,你会看到里面并没有文件。这需要我们自己动手把项目中的文件按照目录层次一一添加过来。建立项目以后,就不需要这么繁琐了。在 Source 下添加完文件之后,会看到如图 5 所示的结果:
这样,D-Phoenix 库项目就建立好了。接下来开始编译项目。这里需要说明的是,我们不使用 Poseidon IDE 自带的编译选择。而是使用外部工具自己编写 DMD 编译器编译指令。
首先,选择 Poseidon 工具栏上的如图 6 所示的小图标:
点击这个图标旁边的下拉按钮,选择 Customize… 。这时弹出 External Tool Configuration 窗口。删除所有的外部工具,我们重新添加所需要的工具。点击 Add 按钮,按照如下方式配置该工具:
-
在 Name 上,填写 DMD (Debug + UnitTest) - Static Library。这意味着我们正在使用 DMD 编译器生成 debug 模式下的静态库,而且在编译过程中,会自动进行单元测试。
-
在 Command 上,填写 DMD 编译器所在的位置。按照如上所述,这里应当是 C:\dmd\bin\dmd.exe 。
-
在 Arguments 上,填写 $(ProjectAll) -lib -g -c -unittest -debug -ofPhoenix.lib 。
-
在 Intial Dir 上,填写 $(ProjectDir) 。
-
分别选中 Capture Output,Hide Window,Save Files First 。
设置完成后,如图 7 所示:
同理,我们可以配置 release 模式的静态库 DMD 编译命令和在控制台输出的 debug 模式 DMD 编译命令。分别如图 8 和图 9 所示:
现在是时候编译 D-Phoenix 库了。我们选择 DMD (Debug + UnitTest) - Static Library 工具编译一下,看能不能成功。如果成功,你会在 d-phoenix\source 目录下看到生成的 Phoenix.lib 静态库,这是 Debug 版的静态库。如果不成功,编译器会报错,这就需要你仔细排查了。你还可以试试其他编译模式,祝你成功,:) 。图 10 是在 release 模式下编译的 Phoenix.lib 截图:
图10 在 release 模式下的 Phoenix.lib
到这一步,已经大功告成。接下来,我来简单的说下如何使用 D-Phoenix 提供的 API,更详细的信息可以参考 API 文档或者查看单元测试代码。
比如大家都很常用的可扩展数组(指的是泛型版)。JDK 提供的是 ArrayList<T>,.NET 提供的是 List<T>,STL 提供的是 vector<T>。在 D-Phoenix 库中提供的可扩展数组是 ArrayList(T),它位于 system.collections.ArrayList 模块中。下面是示例代码(其实是从单元测试里拷贝过来的,呵呵):
//test insert() auto stringList = new ArrayList!(string)(); with(stringList) { insert(0, "a"); insert(0, "b"); insert(1, "c"); } assert( stringList.count == 3 ); assert( stringList[0] == "b" ); assert( stringList[1] == "c" ); assert( stringList[2] == "a" ); auto array = [55,50,22,80,56,52,40,63]; auto list = new ArrayList!(int)(8); foreach( i; array ) { list.add(i); } //test insertRange() auto count = list.count; auto newArray = [1,2,3]; auto newRange = new ArrayList!(int)(3); foreach(i; newArray) { newRange.add(i); } list.insertRange(1, newRange); assert( count+3 == list.count ); assert( list[0] == 55 ); assert( list[1] == 1 ); assert( list[2] == 2 ); assert( list[3] == 3 ); assert( list[4] == 50 );
Well,就到这里吧。嗯,就到这里。