本文分2部分 第1部分:怎样安装ACE(其实就是怎样编译) 第2部分:怎样使用ACE(其实就是把ACE源代码里的1个例子搬出来,然后介绍了下怎么使用)
-----------------------------------第1部分:怎样安装ACE(其实就是怎样编译)-----------------------------------
(1)这个ACE的主页非常的绕.先看下网上摘抄的
主页
ACE的主页为:http://www.cs.wustl.edu/~schmidt/ACE.html,在这里可获得最新版本的ACE以及其他相关资源。
相关网站:
ACE开发者 http://www.acejoy.com/
Douglas Schmidt's Home Page http://www.cs.wustl.edu/~schmidt
ACE-5.4+TAO-1.4+CIAO-0.4 Documentation http://www.huihoo.com/ace_tao/ACE-5.4-html/html/index.html
产品主页 。ACE - The ADAPTIVE Communication Environment http://www.cs.wustl.edu/~schmidt/ACE.html
。JACE - Java版本的ACE http://www.cs.wustl.edu/~eea1/JACE.html
。TAO - Real-time CORBA with TAO(TM) (The ACE ORB) http://www.cs.wustl.edu/~schmidt/TAO.html
。CIAO - Component-Integrated ACE ORB http://www.cs.wustl.edu/~schmidt/CIAO.html
。JAWS - 高性能、自适配的Web服务器,使用ACE提供的构架组件和模式构建,JAWS被构造成“构架的构架” http://www.dre.vanderbilt.edu/JAWS/
。ZEN - JAVA实现的实时ORB http://zen.ece.uci.edu/
。POSIX ACE - (PACE)项目是为轻量级系统设计的提供的操作系统抽像层 http://www.cs.wustl.edu/~schmidt/ACE_wrappers/PACE/docs/www/ 相关资源和项目: The CORBA & CORBA Component Model (CCM) Page http://ditec.um.es/~dsevilla/ccm/
OpenCCM - The Open CORBA Component Model Platform http://openccm.objectweb.org/
starccm, an CORBA Component Model research project(including OTS and PSS), funded by Chinese 863 Hi-tech research program. Core designer/core developer. http://sourceforge.net/projects/starccm/
Agent and Distributed Objects Quality of Service (QoS) http://www.atl.external.lmco.com/projects/QoS/
POSA1,POSA2文档 http://www.huihoo.com/download/ace-tao/posa.ppt http://www.huihoo.com/download/ace-tao/posa2.ppt
(2)参考完上面的网站后,第1次用的人可能都分不清是非了.下面就1步1步傻瓜式的操作弄清
第1步:去这个网站下载http://download.dre.vanderbilt.edu/
下载ACE-6.0.0.tar.gz 这个就可以了(上面有很多,按需所选了,第1次用的话,先将就用这个吧)
第2步:下完后解压到D:\ACE_wrappers_6_0_0
可能第1次看,会有些不明白这些是做什么的,下面专门从网上摘抄的,做了一下简单说明
ACE_wrappers的子目录中大致包含7个目录:分别为:
o ace 包含ACE工具包的源码
o bin含有许多有用的实用程序
o apps 包含许多基于ACE的应用程序,比如Gateway消息路由
o docs 含有与ACE的各个方面的有关信息,比如它的编码指导方针
o examples 包含很多例子,演示怎么使用ACE类和框架
o tests含有ACE的回归测试套件
第3步编译
1.在D:\ACE_wrappers_6_0_0\ace目录中创建一个头文件,命名为config.h,其内容为: #include "ace/config-win32.h"(必选项)
2.在VC++中加载ACE的工程文件(ACE_ROOT \ace\ace.dsw),在release和debug两种编译方式下进行编译,得到相应的库文件(ACE.dll、ACE.lib 和 ACEd.dll、ACEd.lib),其中ACE.dll 、ACE.lib是由release版生成的,ACEd.dll、ACEd.lib是由debug版生成的。具体操作方法:运行VC++,选择Build ->Batch Build…,将ACE-Win32 Debug和ACE-Win32 Release全部选中,Rebuild All即可. 备注:我这里用的是VS2010中文版,在VC++中加载ACE的工程文件(ACE_ROOT \ace\ace_vc10.sln),可能稍微与上面有些区别,但是大致意思同上面一样 。另外可能对这里的ACE_ROOT感到疑惑,下面有介绍。先看下批生成怎么样做,如图所示
点生成->批生成->选上win32(如果系统是64位,就选X64)->生成或重新生成
编译成功后(大概要编译30分钟,视机器性能了),在D:\ACE_wrappers_6_0_0\lib这个路径下会产生引入库(.lib)与链接库(.dll),如图所示
注意:liunx下的DLL动态链接库是.so后缀名 到这里就安装完成了,其实就是编译了.没什么.
ACE和VS的比较:VS是个编译工具,ACE是个库
区别就是:VS给你编译好了,直接写代码即可,而ACE就是要用户自己编译工具与设置系统环境(整的很深奥似的,其实是把一个简单的东西整的很复杂而已,不过ACE是跨平台的,能理解),看完下面怎样使用后,你就会对这整个流程有个初步了解
-----------------------------------第2部分:怎样使用ACE-----------------------------------
一共2个例子: 例1,是ACE上的源代码 例2,就是自己另外写的
--------------------举例1:这里以D:\ACE_wrappers_6_0_0\examples下的Logger事例--------------------
先从ACE目录中拷贝到别的地方(不要放在原版目录中,因为原版是引用文件与库文件的地方).做下测试
用VS2010打开
报错1:
3>InitializeBuildStatus: 3> 正在创建“Debug\Logger_Simple_Server_vc10\I386\Logger_Simple_Server.unsuccessfulbuild”,因为已指定“AlwaysCreate”。 3>ClCompile: 3> Logging_Acceptor.cpp 3>f:\vc测试\logger\simple-server\logging_acceptor.cpp(3): fatal error C1083: 无法打开包括文件:“ace/WFMO_Reactor.h”: No such file or directory 3> Logging_Handler.cpp 3>f:\vc测试\logger\simple-server\logging_handler.cpp(3): fatal error C1083: 无法打开包括文件:“ace/Log_Msg.h”: No such file or directory 3> server_loggerd.cpp 3>f:\vc测试\logger\simple-server\server_loggerd.cpp(10): fatal error C1083: 无法打开包括文件:“ace/Get_Opt.h”: No such file or directory 解决办法:
在属性中放上
包含目录 D:\ACE_wrappers_6_0_0
库目录 D:\ACE_wrappers_6_0_0\lib
如图所示
当然,你若不想拷贝到别的目录,直接在ACE原版目录下的那个事例下编译也行,它不会报这个错误,因为它路径,已经指定好了../../../lib,上层目录的上层目录的上层目录的下层目录lib,所以直接编译不会报错(可参考)
报错2:
说找不到ACEd.dll,如图所示
这个问题:解决办法:是从源头找起
首先:要明白DLL的历史
摘抄:孙鑫<<VC++深入详解>>第19章701页
Windows API中所有的函数都包含在DLL中,其中有3个最重要的DLL.
Kernel32.dll,User32.dll与GDI32.dll 静态库和动态库
静态库
函数和数据被编译进一个二进制文件(通常扩展名为.lib).在使用静态库的情况下,在编译链接可执行文件时,链接器从库中复制这些函数和数据并把它们和应用程序的其它模块组合起来创建最终的可执行文件(.exe文件).当发布产品时,只需要发布这个可执行文件,并不需要发布被使用的静态库
动态库
在使用动态库的时候,往往提供两个文件:一个引入库(.lib)文件和一个DLL(.dll)文件.虽然引入库的后缀名也是"lib",但是,动态库的引入库文件与静态库文件有着本质区别,对一个DLL来说,其引入库文件(.lib)包含该DLL导出的函数和变量的符号名,而.dll文件包含该DLL实际的函数和数据.在使用动态库的情况下,在编译链接可执行文件时,只需要链接该DLL的引入库文件,该DLL中的函数代码和数据并不复制到可执行文件,直到可执行程序运行时,才去加载所需要的DLL,将该DLL映射到进程的地址空间中,然后访问DLL中导出的函数.这时,在发布产品时,除了发布可执行文件以外,同时还要发布该程序将要调用的动态链接库
其次,此源代码的程序默认的运行库是多线程调试DLL,如图所示
这里很明显是动态库,上面也讲动态库的基础.这里主要是包含LIB.目录已经指的很清楚,上面已说了.
编译链接时也能正常通过,这说明LIB并没有问题.很明显的.这个DLL在ACE第1次"安装的时候",就已经固定了.
解决办法: 方法1.把这个ACEd.dll放到与.exe的同一目录,这样运行可执行程序时不会报错了
方法2.把这个ACEd.dll放到C:\WINDOWS\system32目录下
方法3.改系统参数,以下是摘抄的
无法找到动态链接库aced.dll于指定的路径? 为系统变量PATH加上D:\ACE_wrappers\bin 第1次看不太明白.没关系.按照下面的傻瓜式步骤.看完,你就会了
桌面->我的电脑->属性->高级->环境变量,这时会出现2个选项
第1个:Administrator的用户变量--->这个的意思是只为此超级管理员设置,单独的用户设置,如果有来宾用户,就是单独的来宾用户
第2个:系统变量--->这个是全局的.所有不管是超级管理员还是来宾用户
这里选择第2个系统变量->找到Path,打开弹出变量名:Path 变量值:.....
增加格式如下;+路径
;D:\ACE_wrappers_6_0_0\lib
拷贝这个到最后即可,如图所示:
任何一种方法都能运行程序.
到这里也顺便讲讲ACE_ROOT,为什么要在系统变量中添加这个,上图也添加了个ACE_ROOT2,做参考.其实它无非是一个路径名而已.但是它的最重要功能是可移植性.因为ACE的设计就是跨平台,所以添加这个系统变量是很正常的
摘抄:
环境设置
你可能打算注册一些环境变量指向你安装OGRE的根目录,这样你可以把你的所有路径与这个变量关联。这样的话当你移动这些东西到别处或者别的机器上时可以非常简单的重新定位这些路径。关于查看与修改环境变量,请参阅以下文档:Windows, Linux以及 Mac OSX。
- 如果你下载并安装了预编译版(precompiled) OGRE SDK,那你应该已经拥有一个名为'OGRE_HOME'的环境变量了,它指向了你安装OGRE的那个文件夹。如果没有的话,你也许是在系统的另一个用户下安装的OGRE,那么手动定义一下 OGRE_HOME 环境变量就行了。
- 如果你下载的是源代码版本,你应该注册一个新的环境变量 OGRE_SRC 指向OGRE源代码中的'ogrenew'文件夹。
这个就是为什么要加系统变量ACE_ROOT的原因!
--------------------举例2:--------------------
例子2:会比例子1标准一点.一步一步前进
首先:系统配置环境:
变量名 ACE_ROOT 变量值 D:\ACE_wrappers_6_0_0
变量名 Path 变量值 在后面增加;%ACE_ROOT%\lib
其它都基本上同上面一样.不过建议一点:库路径最好放统一.为了体现可方便跨平台性(比如公司有一台写了一个程序,要能直接拷贝到宿舍就能直接用,不需要在配置系统环境)
在VS中配置时,
(2)VS中配置环境--->注意在Debug与Release版本各配置一次(配置方法一样),这样以后切换时,就不需要配来配去了
正确配置:
包含目录:$(ACE_ROOT)
包含库:$(ACE_ROOT)\lib
错误配置:注意$与%别弄混了
包含目录:%ACE_ROOT
包含库:%ACE_ROOT%\lib
注:这个和Windows的Hello World!有着本质的区别.这个是用具有跨平台的库写出来的
代码如下:
// login.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h"
#ifdef _DEBUG #pragma comment (lib,"ACEd.lib") #else #pragma comment (lib,"ACE.lib") #endif
#include "ace/OS_main.h" #include "ace/Service_Config.h"
int ACE_TMAIN (int argc , ACE_TCHAR *argv[]) { ACE_OS::printf("Hello World!\n"); return 0; }
附注1:本文讲的是最基础的.比如怎么安装,与怎么编译ACE自带的代码,并且给出怎样自己写出一个Hello World!先认识一下,1步1步来认识它