ACE的构建(VC++6.0环境)

作者在 2009-01-07 17:35:06 发布以下内容
ACE的构建(VC++6.0环境)
Windows下ACE的构建
1. 将ACE-5.5.zip解压到所需的安装目录,此处以E:\为例,解压后形成ACE_wrappers文件夹,因此ACE将会存在于ACE_wrappers\ace目录中。ACE_ROOT=E:\ACE_wrappers。
2. 在系统中新建ACE_ROOT环境变量,值设为 E:\ACE_wrappers。具体设置为:我的电脑->属性->高级->环境变量->新建
3. 在E:\ACE_wrappers\ace目录中创建一个头文件,命名为config.h,其内容为:
#include "ace/config-win32.h"(必选项)
#define ACE_HAS_STANDARD_CPP_LIBRARY 1 (MSVC自带的标准C++头文件)
// #define ACE_HAS_MFC 1(与MFC一起使用) 没有去除时与  #define ACE_HAS_MFC 0冲突 zhongyunde@tom.com
#define ACE_NO_INLINE(取消函数内联从而减小静态库和运行码的大小)
#define ACE_AS_STATIC_LIBS(构建ACE的静态版本)
#define ACE_HAS_WINNT4 0(在Windows 9x/me上构建所需,在ACE中移掉一些WinNT/Win2K中特有的代码)
以上只需要添加前两项就可以了。
4. 在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即可。如下图所示:

按照上面的方法可能只编译出ACE.dll 、ACE.lib库文件,具体原因还不详。按照下面的操作方法进行编译可以成功生成全部库文件。具体操作方法:Build->Set Active Configuration…分别选中ACE-Win32 Release进行编译即可。如下图所示

同样打开ace_static.dsw编译生成ACEs.lib、 ACEsd.lib、ACE_RMCasts.lib、ACE_RMCastsd.lib、TMCasts.lib、TMCastsd.lib

5. 配置ACE环境。 打开VC++6.0,选择Tools->Options->Directories 加入以下内容:
1) Executable File:E:\ACE_wrappers\bin
2) Include File:E:\ACE_wrappers
3) Library Files:E:\ACE_wrappers\lib
4) Source Files:E:\ACE_wrappers
在编写程序时要在Project->Settings菜单中进行如下设置:
C/C++选项卡:
Code Generation:选择多线程版运行时库(Multithreaded DLL)。
Preprocessor:在“Additional include directories”域中加入$ACE_ROOT。  
Link选项卡:
Input:在“Object/library modules”域中包含适当的ACE库文件,在“Additional library
path”域中包含ACE库链接文件的路径。这通常是ACE_ROOT/ace。
其中 DLL debug对应ACEd.lib
    DLL release对应ACE.lib
    Static library debug对应ACEsd.lib
    Static library release对应ACEs.lib
    MFC DLL debug对应ACEmfcd.lib
    MFC DLL release对应ACEmfc.lib
   主要用到以上两个库。

6. 在系统环境的变量 path中加入E:\ACE_wrappers\bin,否则在运行程序的时候碰到寻找ace.dll或者aced.dll的问题。
7. 在MFC程序中使用时,应该在InitInstance()中添加:
WSDATA wsData;
WORD VerRequested = MAKEWORD (2, 2);
WSAStarup (VerRequested, &wsData)
注:可以在头文件中加入如下代码就不用再手动填加lib库文件
#ifdef _DEBUG
#pragma comment (lib,"aced.lib")
#else
#pragma comment (lib,"ace.lib")
#endif
8. 在windows下release时有可能报错,错误如下:
error C2039: 'TryEnterCriticalSection' : is not a member of '`global
error C2065: 'TryEnterCriticalSection' : undeclared identifier
解决办法:
工程 Project-->setting-->C/C++   写入:_WIN32_WINNT=0x0500
Linux 下ACE的构建
1. 设置环境变量ACE_ROOT,命令如下:
“vi /etc/profile” ,在“export PATH USER….”后加入4行
 ACE_ROOT=/opt/ACE
 export ACE_ROOT
 LD_LIBRARY_PATH=$ACE_ROOT/aceLD_LIBRARY_PATH
 export LD_LIBRARY_PATH
完 成后将/etc/profile执行一次,命令:“chmod 555 /etc/profile”,“/etc/profile”。这样我们的ACE_ROOT就设置好了,可以用如下命令查看ACE_ROOT是否设置好了: “echo $ACE_ROOT” ,这个时候最好reboot启动一次linux。
2. 解压ACE.tar.gz包:
不 要自己手工将ACE.tar.gz包完全解开,特别强调不要完全解开,后面可以看到安装脚本会给我们解开它的;如果你手工解开全部,安装脚本将会将你的解 压缩目录删除的!我们要做的事就只是将ACE.tar.gz包中的ACE-install.sh安装脚本单独解出来,并对其修改。我们只要这一个文件就可 以。用mkdir建目录,如/home/my/ACE,然后将你的ACE.tar.gz放在此目录下(用cp命令拷贝或mv命令移动到此目录)。注意这个 目录将是你的一个存放ACE.tar.gz的目录,安装脚本会来这个目录找这个文件的,这个目录和ACE_ROOT是不一样的,且ACE- install.sh也提示不要将这两个目录设置成同一个目录。ACE_ROOT将是我们的安装目标目录。
3. 从ACE.tar.gz解压出单个文件ACE-install.sh,命令如下:
“tar –zxvf ACE+TAO+CIAO.tar.gz ACE_wrappers/ACE-install.sh”
解 好后,会出来一个新的子目录“ACE_wrappers”。此时可以先将ACE-install.sh移到外面的目录来:“mv /ACE_wrappers/ACE-install.sh .” “.”代表当前目录。当然ACE-install.sh在什么路径下是没什么影响的,因为我们要对ACE-install.sh的内容进行修改的,里面有 很多路径要修改。现在在/home/my/ACE就有了ACE-install.sh,我们现在用vi对其进行修改,修改前自己可以先备份一个。命令: “cp ACE-install.sh ACE-install.sh.bak”,“vi ACE-install.sh”先找到“MY_ACEDIR=${HOME}/aceconfig”,将其改成“MY_ACEDIR= /home/my/ACE”,就是改成我们自己建的、放有ACE.tar.gz文件的目录,之后去掉前面的注释“#”号。接着在下面一点,找到 “MY_ACE_CONFIG=config-sunos5.4-sunc++-4.x.h”,将其修改成“MY_ACE_CONFIG=config- linux.h”,即改成linux下的配置文件。继续改,找到“MY_ACE_GNU_MACROS=platform_sunos5_sunc++. GNU”,将其改成“MY_ACE_GNU_MACROS=platform_linux.GNU”。这个是各种操作系统平台下的GNU宏文件设置。文件 修改完毕,保存退出“:wq”。
4. 安装ACE:
此时应该是在/home/my/ACE目录下,我们执行: h./ACE-install.sh
此 后将是较长时间的解包、编译等待时间。这个过程将不会出现任何错误,因为安装脚本将为我们做很多事情,如:生成config.h,生成 platform_macros.GNU。我们不需要按ACE-install.html中说的手工改东西:不用做连接“ln -s config-sunos5-sunc++-4.x.h config.h”,安装脚本会给我们做好;(题外话:Windows中没有文件连接这一说,所以要自己生成一个config.h文件,再在它的里面加一 句话“#include "ace/config-win32.h"”。)
如果编译中出现错误,如“../apps/gperf”等,请编辑$ACE_ROOT/apps下的Makefile,将其中的有关“gperf”的部分注释掉,这个东西只是一个例子,可以不去编译它。
强调一下,用ACE-install.sh来安装,会编译ACE、tests、apps等。最后会生成libACE.so及tests、apps下也会出来很多经过编译的文件。
当然如果你只是下载了ACE.tar.gz这样的单个包来安装,你可以手工改文件,再make,因为只编译ACE,工作就少了很多,手工做还可以接受。
ACE学习资料
1. ACE 程序员指南:网络与系统编程的实用设计模式 网络与系统编程的实用设计模式   ACE Programmer's Guide practical Design Patterns for Network and Systems Programming
(美)Stephen D. Huston,(美)James CE Johnson,(美)Umar Syyid著
马维达 译 中国电力出版社
2. C++网络编程 卷1:运用ACE和模式消除复杂性
C++ Network Programming Volume 1 Mastering Complexity with ACE and Patterns
[美]Douglas C.Schmidt,Stephen D.Huston /著 [美]Douglas C.Schmidt,Stephen D.Huston 著,於春景 译   华中科技大学出版社
3. C++网络编程,卷2 基于ACE和框架的系统化复用
C++ network Programming, Volume 2 Systematic Reuse with ACE and Frameworks
Douglas C.Schmidt, Stephn D.Huston /著   | 马维达 译 电子工业出版社
4. ACE的官方网站  http://www.cs.wustl.edu/~schmidt/ACE.html
5. 马维达的主页 http://www.flyingdonkey.com/
6. RIVERACE公司 http://www.riverace.com
7. 灰狐          http://www.huihoo.com/
8.     ACE类库    http://dev.csdn.net/article/40/40700.shtm


常见错误
错误1:
“Cannot open include file: ace/SOCK_Acceptor.h: No such file        or directory”
解决方法:
Project->settings->C/C++: Preprocessor的Additional include directories中加入$ACE_ROOT,如E:/ACE_wrappers
错误2:
“You must link against multi-threaded libraries when using ACE (check your project settings)”
解决方法:
Project->settings->C/C++: Code Generation 的Use run-time library : Debug Multithreaded Dll
错误3:
“error C2065: ACE_ERROR : undeclared identifier”
“error C2065: ACE_DEBUG : undeclared identifier”
解决方法:
在原马中加入#include ace/Log_Msg.h
错误4:“error C4716: ace_main_i : must return a value”
解决方法:
在main中加入return 0;
错误5:
“error LNK2001: unresolved external symbol __declspec(dllimport) int __cdecl”
解决方法:
Project->settings->Link->Input: Object/library Modules加入aced.lib ,Additional Library Path中加入$ACE_ROOT\ace,如E:\ACE_wrappers\ace
编译client中遇到的问题:
错误6:
error C2039: sprintf : is not a member of ACE_OS
解决方法:#include ace/OS_NS_stdio.h
错误7:error C2039: strlen : is not a member of ACE_OS
解决方法:#include ace/OS_NS_string.h
错误8:无法找到动态链接库aced.dll于指定的路径
解决方法:为系统变量PATH加上D:\ACE_wrappers\bin
静态包含:
   工程-设置-C/C++-预处理程序定义中加入 ,ACE_AS_STATIC_LIBS
  
  
例1server编译后生成
server.exe 16K   serverd.exe 97K     servers.exe 124K serversd.exe 669K
(servers.exe较适合发布)

例2 client编译后生成
client.exe 16K   clientd.exe 97K     clients.exe 124K clientsd.exe 669K
(clients.exe较适合发布)

测试 clients 127.0.0.1 1919
       servers 1919


如果编译器支持64位,通过什么宏定义来区分64位还是32位阿?
答:#define ver ((2>>31)>0?64:32)
-------------------------------------------------------
给ACE初哥初妹的话

给ACE初哥初妹的话

version 0.1.0 Stone jIang 2006-11-6

下面列出了初学ACE必要的基础知识,希望能给初学ACE的朋友们一点帮助。特加上版本号,这是为了欢迎批判,补充和修订。

1. C++/OOP (有一部分高手是C语言背景根深蒂固的,思考问题不是面向对象,这类人学ACE需要先补补OOP思想)

2. Design Pattern (ACE不仅仅是类库,而是通过模式协同在一起的一系列相关的类,如果对设计模式熟悉,那么会用助于学习ACE)

3. Framework (Framework应该还不正式,相似的词还可以是architecture,不管用啥词语,所要指出的是,ACE不仅仅是类库,更是通过模式组合在一 起相互协作的类形成的半成品。框架有别于类库,后者通常是被动的被程序员写的代码调用,而框架则往往主动地调用用户实现的接口,即著名的好莱坞原则—— Don't call me , I will call you)

4.Linux(我是Linux初不者,但自从我开始进入Linux 编程的时候,我就发现,ACE许多精华源自Linux,以前对ACE理解有限,不知道为什么这样,其实在Linux中能找到答案,ACE里闪烁着Linux的智慧。)

5. Richard Stevens. (英年早逝的Richard,应该是Douglas的良师益友,他的著作影响了Douglas,也就影响着ACE,这里要说的是TCP/IP Illustrated ,其实Richard其他著作,像APUE都是大滋大补的)

6. 没有6了。如果你认为有,一定告诉我。
技术 | 阅读 7966 次
文章评论,共1条
vfdff(作者)
2009-01-07 17:59
1
ACE简介以及ACE_DLL动态库操作类的使用 - [ACE]<br />
<br />
版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明<br />
http://egeho123.blogbus.com/logs/14071965.html<br />
<br />
ACE简介以及ACE_DLL动态库操作类的使用&nbsp;&nbsp;<br />
1 引言<br />
接触ACE已经有长一段时间了,但一直来没有应用的实际需求,因此这方面的学习进展一直很慢,到目前才初步学习了一下日志、TCP/UDP简单网络程序的编写。最近由于工作需要的驱使,学习了ACE_DLL这个类。下面我将从一个完全初学者的角度,谈谈如何认识和了解ACE。<br />
2 初识ACE<br />
刚开始听到ACE这个词,我就对它产生了兴趣,因为据说它提供了跨平台的网络编程,能够在UNIX下跑自己写的网络程序,兴奋啊。于是第二天,就去书店买了本《ACE程序员指南》(Stephen D. Houston著,马维达译,中国电力出版社出版),那天晚上搞了很久终于在VC60上搭建了环境,跑了第一个程序,感觉非常良好。STOP!!!废话不说了,下面转入正题,谈谈ACE环境的搭建吧。<br />
3&nbsp;&nbsp;ACE开发环境的搭建<br />
3.1 获取最新版的ACE安装包<br />
去这个网址(http://www.cs.wustl.edu/~schmidt/ACE.html)获取一个最新发布(Latest Release)的ACE包,然后安装到你的计算机上。<br />
3.2 环境变量的设置<br />
&nbsp;&nbsp;&nbsp;假设你将ACE安装到了“D:\ACE\ACE_wrappers”,那么按照如下步骤进行环境变量的设置:<br />
(1)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;鼠标右击“我的电脑”选择“属性-à高级-à环境变量”,出现以下界面:<br />
图1 ACE环境变量的设置<br />
(2)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;新建变量为“ACE_ROOT”,值为“D:\ACE\ACE_wrappers”的环境变量。然后退出,重新启动你的电脑,设置完后必须重启电脑,才能生效!!!!!!!!!!!!!!!!!<br />
3.3 编译ACE<br />
上面两步做完了之后,我们需要自己编译得到DLL和相应的LIB,我们需要进行两次编译。一次以DEBUG方法编译,生成的DLL和LIB名称为:ACEd.dll和ACEd.lib。另一次以RELESE方式编译,生成的DLL和LIB名称为:ACE.dll和ACE.lib。<br />
编译完成之后,生成的动态库都在“$ACE_ROOT\lib”(即:D:\ACE\ACE_wrappers\lib)目录下。<br />
4 在VS2003中设置环境<br />
(1)打开VS2003,选择“工具à选项-àVC++目录”,如图二:<br />
图2 VS2003的ACE包含目录/lib库路径设置<br />
(3)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;选择“包含文件”,将ACE_ROOT加进入,如图3:<br />
图3 ACE包含文件的添加<br />
(4)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;选择“库文件”,添加库文件的路径,(这个好象也可以不加哈,可以自己试一下看)如图4:<br />
图4 ACE 库文件的添加<br />
(5)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OK,开始测试一下,写个HELLO WORLD吧。<br />
5 写一个HELLO WORLD<br />
(1)新建一个“MyFirstACE”的WIN32项目,如图5:<br />
图5:新建HELLO WORD<br />
(2)对工程进行设置,选“控制台应用程序---》空项目”,如图6:<br />
图6 HELLO WORLD应用程序的设置<br />
(3)点“完成”,然后在解决方案管理器的源文件文件夹中添加一个MyFirstACE.cpp,如图7:<br />
图7 添家CPP文件<br />
(4)修改工程的设置(这一步很重要):<br />
“项目---》MyFirstACE属性”,进入下面的属性项设置界面,将运行时库设置为“多线程调试(MTd)”:<br />
图8 属性项设置<br />
&nbsp;&nbsp;&nbsp;然后在将链接器的输入项进行设置:如图9:<br />
图9:设置链接器输入<br />
点“确定”。<br />
(5)添加以下源代码到CPP文件中:<br />
#include &quot;ace/Log_Msg.h&quot;<br />
#include &lt;iostream&gt;<br />
using namespace std;<br />
int main(int argc,char**)<br />
{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ACE_DEBUG((LM_INFO,ACE_TEXT(&quot;HELLO WORLD!&quot;)));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cin.get();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return 1;<br />
}<br />
(6)编译,哈哈,弹出下面的错误提示,图10:<br />
图10 出错了<br />
(7)赶快从$ACE_ROOT\lib中把ACEd.dll和ACEd.lib拷贝一份到现在的工程目录的DEBUG文件夹下,如下图11:<br />
图11 包DLL和LIB拷贝到DEBUG文件夹<br />
(8)再重新编译一下吧:<br />
图12 HELLO WORLD<br />
多了很多信息,这些是调试信息,可以用开关关闭的。<br />
6 ACE_DLL动态库操作类<br />
ACE提供了很多很多工具给我们使用,最大优点就是跨平台并且源代码公开的。ACE_DLL类主要用于对DLL的操作。<br />
6.1 成员列表<br />
下面这个表格列举了所有ACE——DLL的成员,包括从基类继承的成员。<br />
<br />
ACE_DLL(int close_on_destruction=1)<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
ACE_DLL<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
[explicit]<br />
ACE_DLL(const ACE_TCHAR *dll_name, int open_mode=ACE_DEFAULT_SHLIB_MODE, int close_on_destruction=1)<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
ACE_DLL<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
[explicit]<br />
ACE_DLL(const ACE_DLL &amp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
ACE_DLL<br />
close(void)<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
ACE_DLL<br />
close_on_destruction_<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
ACE_DLL<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
[private]<br />
dll_handle_<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
ACE_DLL<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
[private]<br />
dll_name_<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
ACE_DLL<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
[private]<br />
error(void) const<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
ACE_DLL<br />
error_<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
ACE_DLL<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
[private]<br />
get_handle(int become_owner=0) const<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
ACE_DLL<br />
open(const ACE_TCHAR *dll_name, int open_mode=ACE_DEFAULT_SHLIB_MODE, int close_on_destruction=1)<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
ACE_DLL<br />
open_i(const ACE_TCHAR *dll_name, int open_mode=ACE_DEFAULT_SHLIB_MODE, int close_on_destruction=1, ACE_SHLIB_HANDLE handle=0)<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
ACE_DLL<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
[private]<br />
open_mode_<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
ACE_DLL<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
[private]<br />
operator=(const ACE_DLL &amp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
ACE_DLL<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
[private]<br />
set_handle(ACE_SHLIB_HANDLE handle, int close_on_destruction=1)<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
ACE_DLL<br />
symbol(const ACE_TCHAR *symbol_name, int ignore_errors=0)<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
ACE_DLL<br />
~ACE_DLL(void)<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
ACE_DLL<br />
表一 ACE的所有成员列表<br />
6.2 几个关键的方法介绍:<br />
open(const ACE_TCHAR *dll_name, int open_mode=ACE_DEFAULT_SHLIB_MODE, int close_on_destruction=1)<br />
参数说明:<br />
1)dll_name:要打开的动态库名称;<br />
2)open_mode:打开方式;<br />
3)close_on_destruction:这个参数有两个取值,1表示在析构的时候关闭打开的句炳,0表示不关闭;<br />
4)如下面的例子:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ACE_DLL *P = new ACE_DLL();//实例化一个DLL管理器<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;P-&gt;open(&quot;CBase&quot;,ACE_DEFAULT_SHLIB_MODE,1);//打开一个名为CBase的DLL,打开方法为默认,是否关闭为1<br />
symbol(const ACE_TCHAR *symbol_name, int ignore_errors=0)<br />
参数说明:<br />
1)symbol_name:需要调用的DLL库中的方法或对象的名称;<br />
2) ignore_errors:当值为1时,在日志中不生成错误信息,如果为0,那么在日志中生成错误信息;<br />
close(void)<br />
参数说明:<br />
没有参数,关闭打开的动态库<br />
6.3 一个详细的例子介绍:<br />
例子里面:<br />
(1)CSon继承了CBase里的一个纯基类,编译的时候,CSon需要依赖CBase。<br />
(2)CBase需要调用CSon里面一个函数,得到基类的一个对象的指针,来使用。<br />
(3)testacedllcall工程是用来调用CBase里的函数,来测试的。
游客请输入验证码
浏览1942791次