ACE和TAO编译时支持Unicode字符集和Qt
一、概述
前面提到的“简单编译方法”,利用了ACE的默认配置,没有做修改,实际使用时,可能需要修改后再编译,否则和项目的其他库可能存在冲突,尤其是Unicode字符集的问题和wchar_t的处理问题。
二、问题
- Unicode字符集的问题,项目中的其他库、或者和其他语言一起开发调用时,统一为Unicode字符集是很有必要的。按照“简单编译”的方法,是不支持Unicode字符集的。如下图所示:
现在需要把选中项改为“使用Unicode”字符集。一个简单的办法是直接在VC的项目设置中修改,但是这个方法不好。既然MPC可以用来生成sln,必然可以配置项目信息。所以换个方法是很有必要的。
- wchar_t 的问题,wchar_t 是个奇葩的东东,貌似其他平台没有这个玩意,比如移动设备上。VS2008默认建立项目时,是把wchar_t作为内置类型,其他版本的VC也差不多。一般来说,默认选择不会对项目产生什么影响,但是一旦项目中有其他库一起编译链接时,就会产生问题,比如Qt。而Qt 默认是不把wchar_t作为内置类型的,把wchar_t当作了unsigned short,如果不修改ACE的这个选项,那么编译链接就会出问题。
三、目标
直接通过 mpc 的生成命令行的方式,支持Unicode字符集、Qt、不把wchar_t作为内置类型。而不是通过修改MPC生成的VC工程项目属性。实现对tao_ace(在ACE_ROOT/tao下)工程的转换,支持VS2008打开并编译。
四、支持Qt
- 下载并安装Qt,这里安装的是 Qt 4.7,且安装在C:\QtSDK中,细节这里不展开了。
- 建立系统环境变量QT_DIR,内容如下:
QTDIR=C:\QtSDK\Desktop\Qt\4.7.4\msvc2008\
- 建立系统环境变量QT_CFG,内容如下:
ACE或者TAO中的一些程序链接Qt库时,需要这个变量来确定Qt库的版本,如QtCore4.lib等,否则就会链接QtCore.lib这样的库文件。QT_CFG=4
五、生成sln项目文件
参考“简单编译”的方法,完成前面的几个步骤,最后在命令行中,运行如下脚本:
mwc.pl -value_template TreatWChar_tAsBuiltInType=0 -type vc9 ../tao/tao_ace.mwc -features uses_wchar=1 -features qt4=1
六、参数说明:
- -value_template TreatWChar_tAsBuiltInType=0, 目的是把wchar_t不作为内置类型。
- -features uses_wchar=1, 采用Unicode字符集编码。
- -features qt4=1, 支持Qt。
七、小结
- 运行后,就生成了tao_ace.sln工程文件,用VS2008就可以打开并编译了。我的练习中,Debug和Release编译通过,全部成功!
- 命令行中的参数,可以参考ACE-INSTALL.html 文档中,关于Installation prerequisites一块的内容。
- 像参数 TreatWChar_tAsBuiltInType 需要从MPC的文档中去查看,按文档中的说明,一些feature参数,需要从mpb文件中查找。
- 其他工程,比如ACE.mwc,采用类似的方式,只需稍加修改目录即可编译。
- 另外,通过在config.h文件中增加 ACE_USES_WCHAR 和 ACE_HAS_WCHAR 的方法,这里不做讨论了。
- 如果不需要边界对齐,在config.h文件中,可以增加如下两行定义,这样传输的效率更高些。
#define ACE_CDR_IGNORE_ALIGNMENT #define ACE_LACKS_CDR_ALIGNMENT
这两行必须放在最前面。
欢迎自由转载!:)
2013年11月23日