第三章:win系统下安装D
3.1 要求及下载
3.2 文件
3.3 安装
3.4 示列
3.5 连接
3.6 环境变量
3.7 sc.ini 初始化文件
3.8 常见的安装问题
3.9 Windows 和 Linux 两种版本的区别
3.10 D 接口文件
3.11 建造执行文件
3.12 建造库
3.13 编译 dmd
3.14 编译 Phobos什么?
一:要求及下载
1.下载D编译器
2.32位Windows(Win32)操作系统,如WindowsXP
3.下载Win32版本的dmc.zip(C和C++编译器)(非必要的,它是Windows版的
dmd的补充)(64位相同,我这使用32位系统演示后期更新64位系统安装)
二:文件
\dmd2\src\phobos\:D语言运行库源码
\dmd2\src\dmd\:D编译器前端源码遵从双重证书——GPL和Artistic
\dmd2\html\d\
:文档
\dmd2\samples\d\:D程序示例
\dmd2\windows\bin\dmd.exe:D编译器执行文件
\dmd2\windows\bin\shell.exe:简单命令行shell
\dmd2\windows\bin\sc.ini:全局编译器设置
\dmd2\windows\lib\phobos.lib:D运行库
三:安装
打开控制台窗口(在WindowsXP里,可以通过点击[开始][运行])。所有的工具都是命令行工具,这意味着它们都可以运行在控制台窗口里。切换到根目录。在根目录下解压文件。dmd.zip将会创建目录\dmd2,用于存放压缩包里所有文件。dmc.zip会创建目录\dm,用于存放压缩包里所有文件。
通常的过程看起来就象这样:
C:\DocumentsandSettings\YourName>cd\
C:\>unzipdmd.zip
C:\>unzipdmc.zip
四:示列
\dmd2\windows\bin\shellall.sh
五:连接
在成功编译后,直接由dmd编译器完成连接。想要禁止dmd运行连接器,请使用开关-c。
程序必须跟D运行库phobos.lib连接,同时还有C运行库snn.lib。只要这些库在环境变量LIB所指定的路径里,这个操作会自动完成。设置LIB常用的方式是:
setLIB=\dmd2\lib;\dm\lib
如果使用dmd命令来进行编译然后连接成执行文件,那么它将进行一些仅针对Windows执行文件效的优化。在DLL里不要使用结果.obj文件。要将模块编译成可以在exe或DLL里使用的.obj文件,使用-c进行编译。
使用optlink连接器来完成连接。
六:环境变量
D编译器dmd使用了下列环境变量:DFLAGS:DFLAGS的值等同于在命令行添加给dmd.exe。
LIB:连接器使用LIB来指定搜索库文件的地方。在D中,通常的设置是:
setLIB=\dmd2\lib;\dm\lib
LINKCMD:dmd通常通过寻找link.exe(沿着PATH)来支持连接器。想要使用特定的连接器,则可以通过设置环境变量LINKCMD来达到目的。例如:
set LINKCMD=\dmd\windows\bin\link
PATH:如果在跟dmd.exe所在位置相同的目录里没有找到连接器,那么就到PATH指定的路径里去寻找。注意(Note):其它名叫link.exe的连接器有可能不工作。确保DigitalMarslink.exe是在路径PATH里在其它的link.exe之前第一个被搜索到,或者使用LINKCMD来特别指定使用哪个连接器
七:sc.ini初始化文件
dmd会以下列的目录顺序来寻找初始化文件sc.ini:
1.当前工作目录
2.使用环境变量HOME指定的目录
3.dmd.exe所在的目录
如果找到,在该文件里的环境变更将会覆盖任何已有的设置。这就很轻松使得dmd跟冲突使用了环境变量的程序毫无瓜葛。
八:常见安装问题
•使用Cygwin的unzip工具已知会引起奇怪的问题。
•在Cygwin的命令shell里运行编译器已知会引起问题。在想用Cygwin的shell之间,请尽量确认它可以在标准的Windowsshell——cmd.exe下工作。
•安装dmd和dmc到带有空格的路径里会引起问题。
九:Windows 和 Linux 两种版本的别
在Linux里,字符串文字是只读的。对它们的任何写入都会引起段冲突(segmentviolation)。
十:D接口文件
当处理D源文件中的一个导入模块声明时,编译器会搜索该与该导入模块相对应的D源文件,然后处理该源文件,从中提取所需要的信息。另外,编译器也可以搜索相应的D接口文件。D接口文件仅包含模块导入所需要的信息,而不需要整个模块的实现。使用D接口文件而不是D源文件用于导入模块的好处在于:
•D接口文件总是要小很多,因此比相应的D源文件有着更快的处理速度。
•它也可以用于隐藏源代码,例如,人们可以对外提供目标文件库跟D接口文件,而可以不提供完整的源代码。
D接口文件可以由编译器使用开关-H从D源文件创建。D接口文件的扩展名是.di。当编译器处理模块导入声明时,它首先会寻找.diD接口文件,然后才去寻找D源文件。
D接口文件有点类似于C++中的头文件。不过它却不是像C++头文件那必需的,而且它也不是D语言的一部分。它是编译器的一个功能,仅仅是服务于Build过程的优化。
十一:建造执行文件
dmd能够更快地建造可执行文件,如果在命令行输入有尽可能多的源文件的话。在同一次调用dmd时放置多个源文件的更一个好处就是dmd能够完成一定级别的跨模块优化,如跨模块的函数内嵌。
十二:建造库
有三种方式来建造库。例如,假定有foo.d和bar.d需要被编译,而且已经有了目标文件bar.obj以及库文件def.lib,要求将它们全部组合成一个库foo.lib:
1单独编译模块,然后弄成库:
dmd - cfoo.d
dmd - cbar.d
lib - c - p32 foo.lib foo.obj bar.obj abc.obj def.lib
del foo.objbar.obj
2一同编译模块,然后组成库:
dmd - cfoo.dbar.d
lib - c - p32 foo.lib foo.obj bar.obj abc.obj def.lib
del foo.obj bar.obj
3在一步操作里使用dmd来变异和建造库
dmd - lib foo.d ar.d abc.obj def.lib
不会有目标文件写入到磁盘里,所有的操作都在内存里完成。使用-lib还有一个好处就是模块可能被编译成多目标文件,而非恰好是一个模块对应一个目标文件。这样提高了库的粒度,而同时又不必去分裂模块。
十三:编译DMD
cd \dmd2\scr\dmd
make -f win32.mak
十四:编译PHOBOS
cd \dmd2\src\druntime
make -fwin32.mak DMD = \dmd2\windows\bin\dmd
cd .. \phobos
make -fwin32.mak DMD = \dmd2\windows\bin\dmd
注:(基于有完整代码的同时可建造DMD和PHOBOS)