#include \
若是在其它平台上进行编译,还需要添加文件:
$ACE_ROOT/include/makeinclude/platform_macros.GNU 具体方法见ACE Installation Guide。
此外,为了便于今后使用ACE/TAO/CIAO,应当将 ?E_ROOT%/bin(部分通用工具的输出目录)
?E_ROOT%/lib(所有.lib、.dll文件的输出目录) 添加到PATH环境变量中。
并且,需打开VC8,选择Tools -> Options -> Projects and Solutions -> VC++ Directories,添加如下编译器环境变量:
Executable files: $(ACE_ROOT)\\bin $(CIAO_ROOT)\\bin
Include files: $(ACE_ROOT) $(TAO_ROOT)
$(TAO_ROOT)\\orbsvcs $(CIAO_ROOT) $(CIAO_ROOT)\\ciao
Library files: $(ACE_ROOT)\\lib
四、开始编译
现在可以开始编译了,但是,在笔者的Win2000中编译ACE5.5/TAO1.5/CIAO0.5时遇到的第一个问题就是:源码包中的VC Workspace/Solution打开之后一片空白,一个工程也没有。(上一版本没有这个问题。最终通过比较源码包中的.sln文件和通过下面的方法得到的.sln文件,发现其实是由于文件是Unix格式造成的) 几经周折,终于想到了一个办法:自己运行mwc.pl重新生成工程文件。 要运行mwc.pl自然需要安装Perl,安装过程略。
下面简单说说mwc的工作原理:
mwc.pl根据参数中指定的.mwc文件的内容到相应目录下查找.mpc文件,在没有指定.mwc文件或.mwc文件中没有指定查找目录的情况下会尝试进入各子目录,查找.mpc文件(相当于一个makefile文件),按照.mpc文件生成工程信息,若连一个.mpc文件也找不到,就将当前目录下所有可识别的文件当作源文件,产生一个默认的工程文件。最终,mwc.pl将所有工程文件合并到一个独立的Solution/Workspace。 .mwc文件的结构其实很简单,下面是%TAO_ROOT%/TAO_ACE.mwc的全部内容:
// -*- MPC -*-
// TAO_ACE.mwc,v 1.1 2006/02/16 09:20:48 jwillemsen Exp
workspace { ../ace
../apps/gperf/src ../ACEXML/common
../ACEXML/parser/parser ../ACEXML/apps/svcconf
../Kokyu/Kokyu.mpc ../protocols tao
TAO_IDL utils orbsvcs exclude {
orbsvcs/tests
orbsvcs/performance-tests orbsvcs/examples } }
其作用就是告诉mwc.pl到哪些目录下去查找.mpc文件(若没有指定,则表示应检查所有子目录),而其中的exclude则表示应略过那些目录,如果你愿意,完全可以自己编写.mwc文件(不过,工程具体的描述文件.mpc则比较复杂,一言难尽,想一探究竟的话,最好还是看看MPC的说明文档
http://www.cs.wustl.edu/~schmidt/ACE_wrappers/MPC/USAGE或http://downloads.ociweb.com/MPC/MakeProjectCreator.pdf)。
对mwc.pl的工作原理有了基本的了解后,就可以运行mwc.pl生成工程文件了。执行mwc.pl的办法很简单,如要生成使用CIAO的基本工程,可以在%CIAO_ROOT%下运行: mwc.pl -type vc8 CIAO_TAO.mwc
上述命令将产生一个名为CIAO_TAO.sln的Solution文件,有了.sln文件,就可以正式进行编译了。
应用TAO进行CORBA应用开发,下面的几个工程是必须的:
? TAO_IDL_EXE(即tao_idl,也就是我们的idl编译器,自然少不了,并且后续工程也需要用到该编译器。
该工程依赖于ACE、TAO_IDL_BE、TAO_IDL_FE、gperf等多个工程,编译TAO_IDL_EXE是会自动先编译这几个工程)
? PortableServer(即POA库,编写CORBA应用程序哪能离得开POA,该工程依赖于ACE、TAO、CodeSet、
AnyTypeCode等工程) ? Naming_Service(即命名服务,这是对于我们开发CORBA应用相当有用的一个基本服务,该工程依赖的
其它工程就更多了,就不再一一列举了) 而要使用CIAO,则还必须编译%CIAO_ROOT%/DAnCE下的多个工程,这些工程包括: ? ExecutionManager ? NodeManager ? Plan_Launcher ? NodeApplication
这几个工程是部署与配置引擎(Deployment And Configuration Engine,DAnCE)的一部分,负责处理面向组件的应用的部署与配置。
由于工程之间存在的复杂依赖关系,你只需编译最后这三个工程,就可以自动完成约30个工程的编译工作。编译完以上工程后,你的?E_ROOT%/lib和?E_ROOT%/bin下会多出来一些.lib、.dll和.exe文件。作为一个ORB服务,Name_Service.exe被放在其对应的子目录%TAO_ROOT%/orbsvcs/Name_Service下。
注:
1、为了编译CIAO_XML_Utils,需要安装Xerces-C++ 2.7.0,但http://xml.apache.org/xerces-c/提供的下载采用VC6编译,该版本不能用于VC7及以上版本,如果你用的不是VC6,则需要下载源码重新编译。如果你用的是VC++ 2005 Express,由于没有ATL及MFC,在编译时会遇到一些麻烦,可以在SDK Dir\\include下自行添加一个WINRES.h,在其中添加如下代码(两行,空行是必须的): #include
2、如果要试用CIAO,还需用到cidl编译器cidlc,该工具可以从http://www.dre.vanderbilt.edu/cidlc/binary/下载。
参考:
1. Building and Installing ACE and Its Auxiliary Libraries and Services.
http://www.cs.wustl.edu/~schmidt/ACE_wrappers/ACE-INSTALL.html
2. Building and Installing CIAO.
http://www.cs.wustl.edu/~schmidt/ACE_wrappers/TAO/CIAO/CIAO-INSTALL.html 3. The Makefile, Project, and Workspace Creator (MPC).
http://downloads.ociweb.com/MPC/MakeProjectCreator.pdf CORBA Programming with TAO - 3.IDL Data Type(数据类型与Mapping) 摘要: 简要介绍TAO支持的IDL数据类型及其C++ Mapping关系。 一、简单基本数据类型(Simple Basic Types) TAO支持以下简单基本数据类型(%TAO_ROOT%/tao/Basic_Types.h): IDL boolean char octet short unsigned short long unsigned long long long wchar float double long double C++ CORBA::Boolean CORBA::Char CORBA::Octet CORBA::Short CORBA::UShort CORBA::Long CORBA::ULong CORBA::LongLong CORBA::WChar CORBA::Float CORBA::Double CORBA::LongDouble unsigned long long CORBA::ULongLong 以上各简单基本类型对应的C++类型只是对应平台上基本类型的typedef(Java虚拟机之所以能够在各平台上保证统一的数据长度,其实现原理也是如此),但在编写应用程序时,为了保证程序的可移植性,应该总是使用CORBA命名空间中的类型标识。此外,需要注意:在上面的所有类型中,没有我们熟悉的C++基本类型byte(被Octet取代)、int(被Long取代)。 二、复杂基本数据类型(Complex Basic Types) 除以上简单基本数据类型外,TAO还支持以下复杂基本数据类型: IDL string any C++ CORBA::TAO_String_Manager(%TAO_ROOT%/tao/Managed_Types.h) CORBA::Any(%TAO_ROOT%/tao/AnyTypeCode/Any.h) wstring CORBA::TAO_WString_Manager(%TAO_ROOT%/tao/Managed_Types.h) 其中两种String类型在使用时需要注意: 1、应该总是使用TAO提供的(也是CORBA规范规定的)如下字符串操作函数: char * string_alloc(ULong len); char * string_dup(const char *); void string_free(char *);
WChar * wstring_alloc(ULong len); WChar * wstring_dup(const WChar *); void wstring_free(WChar *);
来进行字符串操作,以提高系统的可移植性。
2、(w)string_alloc/(w)string_dup后必须调用(w)string_free来释放分配的资源,为了避免忘记(w)string_free带来的麻烦,有些情况下,我们可以考虑使用String_var类型(String_var是String类对应的智能指针类,除了TAO本身支持的智能指针类型外,tao_idl在生成代码时会自动为每个Object添加一个对应的var类型)。 3、(w)string_alloc(n)会分配n+1个字符(不是字节)空间。 以下是一个简单的字符串操作的例子:
#include
#include
using namespace std;
int main() {
char * p = CORBA::string_alloc(5); // Allocates 6 bytes }
cout << p << endl; CORBA::string_free(p);
CORBA::String_var s = CORBA::string_dup(\); cout << s.in() << endl; return 0;
strcpy(p, \); // OK, \
注:如果你在编译该程序时遇到困难,请在阅读完本系列的第五篇文章后再来测试该程序(下同)。
CORBA::Any与Windows开发中常用的VARIANT类型相当,可以在其中存入任意其他类型的数据,但Any更具有面向对象的风格。在Windows应用中向VARIANT写入信息时需要先设置写入的数据类型,而从中读出数据时往往需要用switch进行判断,相比之下Any的使用就简单多了,我们可以通过<=操作符来向Any类型变量写入信息,而通过>=操作符从Any变量中读出信息。与从VARIANT中解析数据不同的是,由于重载的>=操作符返回的是一个表示转换成功或者失败的标志,因此,我们总是使用if...else而不是switch来对解析结果进行判断。下面是一个使用Any的例子:
#include
#include
int main() {
CORBA::Any a;
CORBA::Octet o; CORBA::Long l;
相关推荐: