ACE历时20年,耗费数千万美金,在中间件领域享有盛誉。更可贵的是,ACE彻底的开源,且没有任何限制条件,完全是共产主义的精神,让人钦佩。
ACE的Wrapper Facade模式解决了夸平台的c++编程问题。虽然我们现在有标准C++,但是目前的C++标准库对于多线程、网络通信、并发处理、进程管理以及小内存分配、共享内存、内存映射文件等诸多实际运用中的问题没有支持。相信随着时间的推移,C++标准库会越来越多的关心我们程序员实际编程中的问题,但是现在,我需要ACE.
ACE的文档在http://www.dre.vanderbilt.edu/Doxygen/Stable/ace/index.html
,你可以从www.riverace.com下载最新的ACE安装包。
首先要确保UBuntu已经安装了g++和openssl。
apt-get install g++来安装g++
通过新立得软件查找libssl来安装。我安装的是libssl0.9.8,libssl0.9.8-dbg,libssl-dev。
然后将ACE压缩包解压,并放到自己的目录(我的目录为/home/freebird/software)下,仔细阅读install.html中关于 unix的部分,按照上面的做,我没有使用传统方式。如果执行configure命令或者make命令时报错,通常是缺少相应的库。安装指定的库以后,一定要重新执行../configure命令。
目录/home/freebird/software/ACE_wrappers/build/ace/.libs下的libACE-5.6.so文件就是我们的动态库文件。
注意,执行make install的时候,要用sudo命令
如果不使用最新版本,也可以用下面的命令在Ubuntu中直接安装,或者用新立德搜索libace。
sudo apt-get install libace-dev libace-doc libace5.4.7c2a libssl-dev
代码编写需要了解ACE的一些基本知识,所有的ace头文件都在ace目录下,我的机器上ace目录安装在/software/ACE_wrappers。
为了确保动态连接库运行时加载正确,需要如下设置:
UBuntu8.04的配置方法--在动态库的配置文件子目录(/etc/ld.so.conf.d)里增加一个文件ace.conf
内容为:/home/freebird/software/ACE_wrappers/build/ace/.libs 这是动态链接库的目录路径,
然后执行ldconfig命令修改全局缓冲文件
如果别的linux系统没有/etc/ld.so.conf.d目录,就需要直接将/software/ACE_wrappers/ace加到/etc/ld.so.conf文件中,然后执行ldconfig命令
下面编写测试代码,如果编译通过,那么环境配置正确:
#include "ace/Log_Msg.h"
#include "ace/OS_main.h"
#include "ace/INET_Addr.h"
#include "ace/SOCK_Connector.h"
#include "ace/SOCK_Stream.h"
int ACE_TMAIN(int argc, ACE_TCHAR* argv[])
{
ACE_DEBUG((LM_DEBUG,ACE_TEXT("freebird./n")));
ACE_SOCK_Connector connector;
ACE_SOCK_Stream peer;
ACE_INET_Addr peer_addr;
if(peer_addr.set(80,"192.168.22.26")==-1)
return 1;
else if(connector.connect(peer,peer_addr)==-1)
return 1;
}
编译的命令并不复杂,主要是编译参数要注意:
g++ -I$ACE_ROOT -L$ACE_ROOT/ace test.cc -lACE
-l后面指定头文件目录/home/freebird/software/ACE_wrappers
-L后面指定ACE库文件路径/software/ACE_wrappers/ace
-l后面指定库文件名称ACE
编写一个makefile也很简单,内容如下:
#define some variables
Shell=/bin/sh
CPlus=g++
CPlusInclude=-I$(ACE_ROOT)
CPlusExtraInclude=-L$ACE_ROOT/ace
Libs=-lACE
CPlusFlags=-Wall -c -g
test.out:
$(CPlus) -o test.out $(CPlusInclude) $(CPlusExtraInclude) test.cc $(Libs)
#make clean will execute this
clean:
rm -f *.o *.out
#make will ignore the file which has one of the below names
.PHONY:
clean test.out
注意:
1)编译命令一定要用tab符号开头
2).PHONY规定的clean 和 test.out,确保不会因为存在这个文件,命令不能执行