转自http://blog.youkuaiyun.com/zhaohaidao/article/details/6330273
步骤:
1. 安装VS2008
2. 下载ACE
3. 新建config.h 并写入
#define ACE_HAS_STANDARD_CPP_LIBRARY 1
//#define ACE_HAS_MFC 1(这句须注掉,不然会有内存泄露)
#include "ace/config-win32.h"并保存于D:/ACE_wrappers
4. 添加环境变量 ACE_ROOT 变量值D:/ACE_wrappers
5. 打开D:/ACE_wrappers/ace/ACE_vc9.sln
6. 工具—选项—VC++目录
包含文件中添加 $(ACE_ROOT)
引用文件中添加 $(ACE_ROOT)/lib
库文件 添加 $(ACE_ROOT)/lib
源文件 添加 $(ACE_ROOT)/ace
7. 编译,如无意外,应该能编译成功
8. 新建win32控制台应用程序—空项目,源文件右键新建C++ CPP文件。
写入hello world 程序
途中所遇问题:
1. 环境变量的设置。
2. 路径混乱。
3. error PRJ0003 :生成“cmd.exe”时出错。 导致原因,将工具—选项—VC++目录下可执行文件中$(Path)不小心删除,系统路径出错。
注意1:
ACE项目的字符集设置是"未设置",而VS2005的c++项目默认字符集是"使用Unicode字符集",如果用到了ACE链接库时需要将字符集改为"未设置"(在"项目属性->配置属性->常规->字符集"中配置),否则可能出现链接错误。
至此,ACE的安装工作便算完成,希望这篇文章对大家安装ACE有点帮助。
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
支持unicode的ACE编译
编译前在config.h中多添加如下两行,并且将项目默认字符集改为"使用Unicode字符集"。
#define ACE_USE_WCHAR
#define ACE_HAS_WCHAR
注意2:
在windows平台下,如果没有定义如上两个宏,ACE会自动将main函数重定义,并主动替你把ACE::init()和ACE::fini()调用好。添加这两个宏后,需要在main函数中手动调用。
main函数重定义这一行为不能保证在所有平台和环境下都正常运作(如使用MFC时),其实不管如何,不妨在main函数的开头和结尾分别再调用一次ACE::init()和ACE::fini()。ACE::init()和ACE::fini()里面都有嵌套层次计数机制,因此只要它们能够保证成对出现,并且不出现交叉嵌套,多调用一遍并不会出现任何问题。
检验
// serverMain.cpp
// 如果是WIN32平台上报错
// f:\ace\ace_wrappers\ace\config-win32-common.h(23): fatal error C1189: #error : Please define WIN32 in your project settings.
// 可以文件头添加WIN32的预定义解决
#ifndef WIN32
#define WIN32
#endif
// 针对Debug版和Release版进行不同预处理
#ifdef _DEBUG
#pragma comment(lib,"ACEd.lib")
#else
#pragma comment(lib,"ACE.lib")
#endif
#include <ace\Log_Msg.h>
#include <ace\Time_Value.h>
#include <ace\SOCK_Acceptor.h>
#include <ace\SOCK_Stream.h>
#include <ace\OS_NS_stdlib.h>
#define SIZE_DATA 18
#define SIZE_BUF 1024
#define NO_ITERATIONS 5
class Server
{
public:
Server (int port): server_addr_(port),peer_acceptor_(server_addr_)
{
data_buf_= new char[SIZE_BUF];
}
//Handle the connection once it has been established. Here the
//connection is handled by reading SIZE_DATA amount of data from the
//remote and then closing the connection stream down.
int handle_connection()
{
// Read data from client
for(int i=0;i<NO_ITERATIONS;i++)
{
int byte_count=0;
if( (byte_count=new_stream_.recv_n (data_buf_, SIZE_DATA, 0))==-1)
ACE_ERROR ((LM_ERROR, "%p\n", "Error in recv"));
else
{
data_buf_[byte_count]=0;
ACE_DEBUG((LM_DEBUG,"Server received %s \n",data_buf_));
}
}
// Close new endpoint
if (new_stream_.close () == -1)
ACE_ERROR ((LM_ERROR, "%p\n", "close"));
return 0;
}
//Use the acceptor component peer_acceptor_ to accept the connection
//into the underlying stream new_stream_. After the connection has been
//established call the handle_connection() method.
int accept_connections ()
{
if (peer_acceptor_.get_local_addr (server_addr_) == -1)
ACE_ERROR_RETURN ((LM_ERROR,"%p\n","Error in get_local_addr"),1);
ACE_DEBUG ((LM_DEBUG,"Starting server at port %d\n",
server_addr_.get_port_number ()));
// Performs the iterative server activities.
while(1)
{
ACE_Time_Value timeout (ACE_DEFAULT_TIMEOUT);
if (peer_acceptor_.accept (new_stream_, &client_addr_, &timeout)== -1)
{
ACE_ERROR ((LM_ERROR, "%p\n", "accept"));
continue;
}
else
{
ACE_DEBUG((LM_DEBUG,
"Connection established with remote %s:%d\n",
client_addr_.get_host_name(),client_addr_.get_port_number()));
//Handle the connection
handle_connection();
}
}
}
private:
char *data_buf_;
ACE_INET_Addr server_addr_;
ACE_INET_Addr client_addr_;
ACE_SOCK_Acceptor peer_acceptor_;
ACE_SOCK_Stream new_stream_;
};
int main (int argc, char *argv[])
{
if(argc<2)
{
ACE_ERROR((LM_ERROR,"Usage %s <port_num>", argv[0]));
ACE_OS::exit(1);
}
Server server(ACE_OS::atoi(argv[1]));
server.accept_connections();
return 0;
}
转自http://blog.youkuaiyun.com/stanjiang2010/article/details/6106708
ACE的编译与安装(windows篇)
(一)源码包的获取
1、下载最新的ACE源码包,我的是ACE+TAO+CIAO-6.0.0.tar.gz;
2、解压至一目录如:D:/ACE_wrappers;
(二)设置环境变量
1、在操作系统添加一个名为ACE_ROOT的用户环境变量,值为刚才ace的解压路径D:、ACE_wrappers;
2、添加用户的Path环境变量,值为%ACE_ROOT%/lib,这样才能保证系统能找到ace生成的动态连接库;
3、设置VS2005的C++开发项目信息,依次打开菜单 工具-选项-项目和解决方案-VC++目录 ,在右侧目录列表中选择"包含目录",添加$(ACE_ROOT),在右侧目录列表中选择"库文件",添加$(ACE_ROOT)/lib;
(三)编译ACE
1、在ACE_ROOT/ace目录创建一个名为 config.h的文件。编辑文件并加入以下内容
#define ACE_HAS_STANDARD_CPP_LIBRARY 1
#include "ace/config-win32.h"
其中第一行是因为我想用标准C++跨平台,第二行则是必须要的,表明当前是在win32的环境下进行ace的项目
2、进入ACE_ROOT/ace目录中,能发现ACE现在已经带VS2005的编译项目了,直接打开ace_vc8.sln,直接生成ACE项目的Debug版和Release版;
(四)设置编译环境
1、配置属性->链接器->常规->附加依赖项,添入ACEd.lib(ACE.lib);
2、如果运行时报没有找到ACEd.dll的错误,则需在检查环境变量path中路径是否设置正确;
(五)例子
#include "ace/ACE.h"
#include "ace/OS_NS_stdio.h"
#include <iostream>
using namespace std;
int main (int argc, char *argv[])
{
char msg[100] = {0};
ACE_OS::sprintf(msg, "hello %s ", "world");
cout << msg << endl;
system("pause");
return 0;
}