搭建Windows下Delphi,C和C++语言的开发环境

实习公司的项目语言环境为Delphi, C和C++,原开发者用的开发环境是Delphi 6和Visual C++ 6.0。
个人比较习惯命令行下操作,也更喜欢使用GCC,所以这里写一下这个月在Windows下搭建环境的心得和遇到的一些问题。

Delphi

这个语言现在似乎比较少用,至少我在接手项目之前没怎么接触过这个语言。搭建环境时我下载了Delphi 2010,这个IDE功能挺完善的(相比Delphi 6),但是编译现有项目时总是提示缺少依赖,折腾了一两天依然没有解决,后使用Delphi 6编译成功。

但是Delphi 6是比较旧的软件,它的窗口都不能很好的合并在一起,对于代码中符号,函数和变量的跳转都不是很智能,很不适合用来研究源码。

所以现在现有的使用方式是,用Delphi 2010查看和编辑代码,用Delphi 6编译和构建。

Can’t create … EditorLineends.ttr

关闭Delphi 6再打开Delphi 2010就会报这个错,重启可以解决,但这样解决显然很笨 -。-

网上找到了相关的Workaround

1
2
3
del %temp%\EditorLineEnds*.ttr 
set dt=%date%_%time:~3,2%-%time:~6,2%
rename "%temp%\EditorLineEnds.ttr" "EditorLineEnds_%dt%.ttr"

执行这个脚本之后再打开Delphi 2010就没问题了,也可以下载相关开源工具,具体看前文中的链接。

C,C++

主程序是由Delphi编写的,主要负责一些业务逻辑以及界面的渲染,底层的数据采集等功能由C++编译成的DLL完成。
目前支持的操作系统是Windows XP和Windows 7

刚开始维护项目程序的时候,不是很想在Win 7虚拟机中搭建开发环境,于是想到了Cross Compile。

Linux下编译Win32应用程序

MinGW-w64这个项目就是为支持编译32位和64位的Windows二进制程序提供完整的运行环境。

我下载的是mingw-w32-bin_x86_64-linux_20131227.tar.bz2

这里面就是一整套跨平台编译工具链啦~

MinGW, Cygwin, MSYS2

Linux主系统编辑代码,编译构建之后传到Win 7虚拟机执行测试,这样还是比较麻烦的,于是开始折腾怎么在Windows上搭建相关的开发环境。

MinGW意为Minimalist GNU for Windows,是将最小化的GNU工具包移植到Windows平台上。

Cygwin则是旨在Windows平台上支持Linux上大量的GNU和其他开源工具,让用户感觉在Linux环境中。

MSYS2是Windows上的软件分发和构建平台,它旨在和Cygwin,MinGW-w64一同为用户服务。

Git Bash and Win-builds

经过尝试我现在使用的是Git for WindowsWin-builds的组合。

Git for Windows提供了Git命令行(Git Bash)和图形界面(Git GUI)。

同时它还打包了MinGW环境,所以安装这个软件之后,就可以在Git Bash中使用一些Linux中常用的命令了。

至于gcc这类的编译工具,我选择了Win-builds这个软件,下载以后打开,选择想要安装的包,点击Process,等待其下载安装完成即可。

编译与构建

一个Makefile实例

Git Bash搭配MinGW的话,要使用mingw32-make,直接使用make的话会报错,具体原因暂时不明。

这里用一个项目中实际用到Makefile实例来讲解,搭配官方文档更好理解。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
# 使用说明:
# 1. make target来执行对应指定目标的规则,
# 不输入target的话默认执行Makefile中第一个规则
# 2. 规则执行流程大概是这样:
# 1) 检查prerequisite是否达成,对于文件目标是检查文件是否存在
# 对于PHONY目标则是直接执行对应规则中的命令
# 2)如果prerequisite达成,执行规则中的命令
# 3)如果prerequisite未达成,执行对应的规则
# 3. 本例中 make 和 make all等效,会生成main.o和main.exe
# 4. make install 则是将lib中的文件和main.exe拷贝到dist文件夹中
# 5. make clean 则是删除main.o

# 定义变量
objects = main.o
exe = main.exe
libPath = ./lib
distDir = dist

# 定义rule
# 格式
# target: prerequisite
# cmd
all: $(objects)
gcc $(objects) -o $(exe) -L $(libPath) -lcurl

main.o: main.c
gcc -c main.c -o main.o

# '|' 后的prerequisite是order-only的
# 这样install这个target构建的时候只会检查$(distDir)是否存在
# 而不会随着该目录内容更新而重新构建
install: clean all | $(distDir)
cp $(libPath)/* $(distDir)
cp $(exe) $(distDir)

$(distDir):
mkdir $(distDir)

# 因为Makefile中默认是根据文件来判断的,而clean这个target不产生文件
# 所以用.PHONY说明clean这个target是假的,
# 这样即使clean这个文件存在,也可以正常使用make clean
.PHONY clean
clean:
rm $(objects)

CMake这个项目这次只是简单了解了一下,它可以根据不同平台使用写好的不同配置来生成Makefile。

查看DLL的依赖

项目中程序带有一些依赖,这些依赖都是以DLL形式被主程序使用的。

自己编译DLL的话,有什么依赖自己都是清楚的。那么如果是使用的别人编译好的DLL呢?有什么方法可以查看DLL的依赖有哪些吗?

ldd在Windows环境下不太好用,部分依赖不能正常显示其名称。

图形界面的话,可以使用dependencywalker这个软件,命令行的话则可以用VC6中的dumpbin.exe。

Windows cmd下使用dumpbin /dependents target

Bash(模拟Linux环境,和Windows命令行下传参方式不同,所以命令不同)使用dumpbin -dependents target

这里target可以是exe,dll等格式。