Make Turbo C++ work as a really modern C++ IDE…

前些时由于某些原因需要一个C++的编译环境,我从1999年之后基本没有碰过C/C++——虽然这是我读书时代使用的主要编程语言——所以不得不重新思考和选择。

众所周知,从Windows 95和Visual C++ 4.*的发布开始,MS的C/C++编译器以及IDE开始全面超越Borland C++,尤其是编译器,无论是效率、代码质量、规范化程度都占据了优势,虽然后来的Borland C++ Builder依靠VCL库赢回了一部分市场,但是毕竟C++的主流不是GUI,而是目前热门的泛型、STL、MPL等,而这些的核心就是C++编译器,恰恰是Borland C++的软肋。这些以前还只是知道而已,这次算是被我结结实实的碰了一把。

缘起:

– 我需要Boost的RegEx库和Thread库;
– 我对于Delphi的深厚感情以及还有我在学生时代对于Turbo C++的熟悉和喜爱;
– 长久以来我对于VS工具的不适;
– 前些时CodeGear的另立门户以及Turbo Explorer的免费策略都引起了不小的震动。

结果:

– 我下载了Turbo C++ Explorer Edition并申请了那个3万多天“试用”的license,决心以此开始已多年未有实践过的C++体验。
– 我要在这个出名的不规范的C++环境下编译目前最出名、最大型的C++类库之一:Boost。

花了我周五晚上Raid完的4个小时外加周六白天的2小时,终于基本成功。下面是主要流程:

1. 去Boost下载最新的Boost源码包,目前的稳定版本是1.33.1。解压到一个目录下,这是Boost的根目录。这个版本并不支持最新的Borland IDE,所以——
2. 去SourceForge下载有人专门为这个最新版本的Borland IDE定制的Boost补丁,并用这个补丁覆盖Boost标准发布。你在这个工程的Compile Status下面可以看到并不是所有Boost库都能很好的支持,但是大部分主要的都OK了。
3. 取得最新的Boost创建工具bjam,你可以自己编译或者直接下一个可执行的程序,这些都在Boost主站有。把bjam.exe放到Boost根目录下。
4. 建立环境变量BCCROOT指向Borland工具的安装根目录,对于我来说就是Turbo C++的根目录,然后在Boost根目录下运行: bjam “-sTOOLS=borland-5_8_2” install ,这里5_8_2是Turbo C++ 10 Update 2的编译器版本(BCC32.exe, v5.8.2)。这会启动一个长时间的创建过程,在我的系统里用了25分钟进行编译和链接,又用了5分钟来复制文件。最后在C:\Boost下面得到了include和lib两个目录,其中,include下面是从Boost源目录copy来的头文件,lib下则包含了所有创建好的静态和动态库的各种版本;在Boost根目录下的bin子目录下也产生了所有中间和结果文件。这里其实只有lib目录是真正有用的。把这个目录整个copy到一个合适的地方——反正我不习惯在C盘放这些,其他目录可以删掉——当然要是不在乎几百兆硬盘也可以搁着。
5. 要注意一个问题:文件名。现在产生的文件既有libboost_thread-bcb58-mt-1_33_1.lib这样带着版本号的,也包括libboost_thread-bcb58-mt.lib这样不带版本号的。对于运行库还有静态lib和动态dll两种。由于某种原因,这些文件并不能立刻被使用,因为:a) Turbo C++需要这样的静态库文件名:libboost_thread-bcb-mt-1_33_1.lib,而没有版本号的那种文件没用,而且表示编译环境的字符串要是bcb而不是bcb58这样带版本的,这些lib必须被手工更名 >_<;2) 让人头晕的是,如果使用动态链接库,这些库的名字则要是boost_thread-bcb58-mt-1_33_1.dll,也就是说dll不需要改名。我的做法是把所有库文件放在一个目录A中,把它加入到系统Path中去以便其中的dll可以被正常的调用,这个目录兼做备份;然后把静态库拷贝到另外一个目录B,然后按照上面的规则改名,这个目录作为Turbo C++链接器使用的静态库路径。 6. 好了,现在可以启动Turbo C++了。在Tools|Option中找到Environment Options|C++ Options|Path and Directories,把Boost源目录加入到Search Path和Bowsering Path中;然后在需要使用Boost的工程的Option中把目录B加入到Project Options|Linker|Paths and Defines|Library search path中。 7. 创建几个测试工程来试试效果。注意,如果要测试Thread库,要在新建工程时选择Multi Threaded选项,这样可以省去很多手工配置的麻烦。另外使用Boost Thread要使用动态链接库,否则会有很多麻烦。 在这个可怕的工作完成之后,我又顺便试了试在Turbo C++里面安装我常用的VCL component,主要是DevExpress系列,因为需要编译,也有不少麻烦,顺便记录于此。 1. 首先需要使用TurboTweaks这个工具来crack掉Turbo C++ Explorer Edition不允许安装第三方component的限制,否则啥也别想。
2. 为了方便,把DevExpress的控件源码版本展开之后,对于每一个库,把Package目录下的所有文件拷贝到Source目录下,然后把Source目录加到Turbo C++的Search Path中。
3. 关键步骤:在Turbo C++中创建一个环境变量LIBDIR,把上面的所有Source目录加入进去,用分号分割。
4. 好了,现在可以一个个库按照依赖顺序编译了,基本不会有啥大问题。唯一奇怪的是安装的设计时库不能显示Description,只能显示一个相当丑陋的文件名,显得很OX。。。
5. 某些库编译会报一个找不到DB.obj的错误,这个是dbrtl的一个文件,你要手动把\lib\release\dbrtl.lib加进去就可以了。
6. 编译QuantumGrid的时候会报一个神奇的错误:F2084 Internal Error: DBG1695,这个非常诡异的问题,是Delphi和C++编译器之间的不兼容导致的,具体原因不明,不过只要在Project|Options – Pascal Compiler|Other Options|Compiler Directives中加入’ D-‘就可以了,当然也可以直接在Additional Option里加入’-$D-‘。
7. 以后有兴趣还可以搞个TurboMerger去装别的语言版本——不过我的D7足够好了。。。

哦对了,由于对于IDE的启动和编译不耐烦,以及对于放在一边的Tools Palette比较厌恶,我还使用了Andy的两个小巧而强大的IDE扩展:Bcc32PchDelphiSpeedUp及其DDevExtensions扩展。这些带有一点hack性质的扩展到目前为止还没发现有什么问题,启动和编译速度提升还是比较明显的。

现在我的Turbo C++中包括了一个完整的STL、MPL开发环境,安装了Raize和全套DevExpress控件集合,足以支持我希望做的测试和研究,但是——这些难道不是应该属于out-of-box的feature么。。。