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_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=0×0500
亲身体验版:
1. 下载 ACE ,解包 (主页 http://www.cs.wustl.edu/~schmidt/ACE.html )
2. 在 ACE_wrappers/ace 目录中创建一个头文件,命名为 config.h ,其内容为“ #include
"ace/config-win32.h" ”
3. VC9 下打开 ACE_wrappers 下的 ACE_vc8.sln ,允许 VC 自动转换。对左列的 ACE 项目进行编译,分别编译 debug 版本和 release 版本。生成的 lib 文件和 dll 文件在 ACE_wrappers 下的 lib 文件夹下。但是,这里的 lib 不能直接连到主程序中,如果要运行的话会提示需要 ACE.dll 文件
4. 所以需要打开 ACE_wrappers 下的 ACE_Static.sln 工程,对左列的 ACE_Static 项目进行编译,分别编译 debug 版本和 release 版本。所生成的 lib 文件和 dll 文件也在 ACE_Wrappers 下的 lib 文件夹下
5. 打开需要用 ACE 的工程,假设要使用 static MFC 和 static ACE
a)
Project->Properties->configuration
properties->General->Use of MFC 选择 use MFC in a static library
b)
Project->Properties->C/C++->general->Additional
Include Directories 添加 ACE_Wrappers 的路径 . ( 例如 ../../..ACE_Wrappers)
c)
Project->Properties->linker->general->Additional
Library Directories 添加 (ACEs.lib for release, ACEsd.lib for debug) 的路径 . ( 例如 ../../..ACE_Wrappers/lib)
d)
Project->Properties->linker->input->Additional
Dependencies 添加 (ACEs.lib for release, ACEsd.lib for debug)
e)
Project->properties->c/c++->preprocessor->preprocessor
definations 添加 ACE_AS_STATIC_LIBS
f)
OK ,可以 build 了。其 release 版本可以直接拷贝到别的机器上运行
Linux 下 ACE 的构建
1. 设置环境变量 ACE_ROOT ,命令如下:
“ vi /etc/profile ”
,在“ export PATH USER … . ”后加入 4 行
l ACE_ROOT=/opt/ACE
export ACE_ROOT
LD_LIBRARY_PATH=$ACE_ROOT/acelLD_LIBRARY_PATH
export LD_LIBRARY_PATHl
完
成后将 /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 librarie
文章出处: http://www.diybl.com/course/3_program/c++/cppjs/200878/132366.html