ACE是個(gè)很有用的開放源代碼的C++網(wǎng)絡(luò)編程開發(fā)包,利用它比直接用API更有利于代碼的健壯性,可移植性,并相對(duì)簡(jiǎn)單。
估計(jì)大家剛接觸ACE時(shí),都有一定難度,說不定就半途放棄了,這是我學(xué)ACE兩天中的總結(jié),基本上不成文,但我想研究到ACE的你一定會(huì)明白下文的意思。
一、ACE官方主頁(yè):http://www.cs.wustl.edu/~schmidt/ACE.html
下載地址:http://deuce.doc.wustl.edu/Download.html
我下載的是Latest Beta Kit中的ACE.zip(Latest Release中的壓縮包好像有問題,我有WinRAR3.30解壓縮報(bào)錯(cuò))
二、解壓縮后放在D盤
D:\ACE_wrappers
三、在D:\ACE_wrappers\ace目錄下新建文件config.h加入一行
#include "ace/config-win32.h"
四、編譯:用VC6.0打開D:\ACE_wrappers\ace\ace.dsw
左側(cè)顯示 ACE DLL classes
ACE LIB classes
或1、從菜單上選擇“編譯”,“放置可遠(yuǎn)行配置”,選擇你需要的工程配置
“編譯”,“重建全部”(或任一,如ACE DLL - Win32 MFC Debug)
此過程可能持續(xù)半小時(shí)至一個(gè)小時(shí)不等
或2、從菜單上選擇“編譯”,“批構(gòu)建”,選擇你需要的工程配置
此過程可能持續(xù)二至四個(gè)鐘頭
產(chǎn)生的.lib文件位于D:\ACE_wrappers\ace\下,
產(chǎn)生的.dll文件位于D:\ACE_wrappers\bin\下
同樣打開ace_static.dsw
編譯
ACEs.lib
ACEsd.lib
ACE_RMCasts.lib
ACE_RMCastsd.lib
TMCasts.lib
TMCastsd.lib
ACE生成的dll和lib文件的命名規(guī)則:(d = debug,s = static)
debug - aced.lib、debug+static - acesd.lib、release - ace.lib、 release+static - aces.lib
五、樣例程序的編譯
用VC打開D:\ACE_wrappers\tests\tests.dsw
“編譯”,“批構(gòu)建”
六、自寫程序的工程配置
中篇:ACE程序員教程.pdf中的樣例程序:
網(wǎng)址:http://www.cs.wustl.edu/~schmidt/ACE_wrappers/docs/tutorials/guide-tutorials.html
將網(wǎng)頁(yè)上的原代碼復(fù)制到一新建文件,并命名為server.cpp
用VC打開,編譯,重建全部,彈出對(duì)話框,“This build command require ...“,點(diǎn)”是“
會(huì)出現(xiàn)以下錯(cuò)誤
如果有“Cannot open include file: 'ace/SOCK_Acceptor.h': No such file or directory”
工程-設(shè)置-C/C++: Preprocessor,附加包含路徑:D:/ACE_wrappers
如果有“ You must link against multi-threaded libraries when using ACE (check your project settings)”
工程-設(shè)置-C/C++: Code Generation - Use run-time library : Debug Multithreaded Dll
如果有“error C2065: 'ACE_ERROR' : undeclared identifier”
error C2065: 'ACE_DEBUG' : undeclared identifier
#include "ace/Log_Msg.h"
error C4716: 'ace_main_i' : must return a value
在main中加入
return 0;
“error LNK2001: unresolved external symbol "__declspec(dllimport) int __cdecl”
工程-設(shè)置-Link-Input: 對(duì)象/庫(kù)模塊:添加aced.lib 附加庫(kù)路徑:D:\ACE_wrappers\ace
編譯client中遇到的問題
1、error C2039: 'sprintf' : is not a member of 'ACE_OS'
#include "ace/OS_NS_stdio.h"
2、error C2039: 'strlen' : is not a member of 'ACE_OS'
#include "ace/OS_NS_string.h"
3、error C2059: syntax error : '?'
錯(cuò)誤在這一句: ACE_DEBUG((LM_DEBUG,?Usage egX <hostname> <port_number>\n?));
將?改為"
4、無法找到動(dòng)態(tài)鏈接庫(kù)aced.dll于指定的路徑
為系統(tǒng)變量PATH加上D:\ACE_wrappers\bin
靜態(tài)包含:
工程-設(shè)置-C/C++-預(yù)處理程序定義中加入 ,ACE_AS_STATIC_LIBS
例1server編譯后生成
server.exe 16K serverd.exe 97K servers.exe 124K serversd.exe 669K
(servers.exe較適合發(fā)布)
例2 client編譯后生成
client.exe 16K clientd.exe 97K clients.exe 124K clientsd.exe 669K
(clients.exe較適合發(fā)布)
測(cè)試 clients 127.0.0.1 1919
servers 1919
下面是馬維達(dá)老師寫的:(轉(zhuǎn)自huihoo)
發(fā)表于: 3/31/2003 - 04:24 |
翻譯的一點(diǎn)小東西,希望能對(duì)大家有幫助。 其實(shí)也不敢稱為是翻譯的,水平太爛了,大家將就著看吧 :)
使用Microsoft Visual C++ 在win32平臺(tái)上生成和安裝ACE:
注意:關(guān)于MSVC5.0和Service Pack 3的使用有一些問題,過去一些用戶在sp2中使用良好的代碼在sp3種卻會(huì)引發(fā)一些問題。感謝Bill 的細(xì)心查找,這一神秘的問題被解決了。答案?(哦,這兒有一個(gè)好答案。。。)這可能是因?yàn)橛卸鄠€(gè)版本的sp3較早版本的sp3有一些bug,而后來的版本修正了這些錯(cuò)誤,從微軟網(wǎng)站上下載的1998年6月16日版本的sp3是一個(gè)良好的版本。如果X03-50158是那些擁有sp3的光盤序列號(hào)的一部分,那么這些版本也是良好的。但是不管任何版本的sp3,其STL的實(shí)現(xiàn)都有錯(cuò)誤,詳細(xì)情況請(qǐng)瀏覽http://www.dinkumware.com/vc_fixes.html。感謝Ben Eng對(duì)這些錯(cuò)誤的修正。 現(xiàn)在的SP4(希望只有一個(gè)版本)已經(jīng)修正了STL中的死鎖問題。 我們現(xiàn)在將不再積極的支持MSVC 4.X以及以前的版本,ACE可和這些編譯器一起工作但是可能會(huì)丟失一些好處。 1. 將ACE分發(fā)包界壓縮到一個(gè)目錄中,這將在那個(gè)目錄中生成一個(gè)包含ACE的目錄ACE_wrappers。接下來的步驟中假設(shè)ACE分發(fā)包被解壓縮到ACE_ROOT=C:\ACE_wrappers中,因此ACE將會(huì)存在于ACE_ROOT\ace目錄中。 2. 在ACE_ROOT\ace目錄中創(chuàng)建一個(gè)文件,命名為config.h,其內(nèi)容為: #include "ace/config-win32.h" 3. 在VC++中加載ACE的工程文件(ACE_ROOT\ace\ace.dsw) 4. 每個(gè)工程都會(huì)包含多個(gè)配置,這些配置是Debug/Release, MFC/Non-MFCh和Static/Dynamic庫(kù)版本等選項(xiàng)的混合。確定你所需要的構(gòu)造(例如,調(diào)試代碼需要ACE的調(diào)試版本)。所有這些不同的配置可以為你提供一些便利,你可以或者采用不同的模式以構(gòu)造不同配置的應(yīng)用,或者通過改變ace\config.h來改變?cè)贜T上的不同配置。 注意:如果你使用動(dòng)態(tài)連接,請(qǐng)保證ACE_ROOT\bin被添加到你的path環(huán)境變量中,否則你將在運(yùn)行程序的時(shí)候碰到尋找ace.dll或者aced.dll的問題。 5. 如果你在Windows NT或者Windows 2k上構(gòu)建ACE,你可以馬上開始構(gòu)造她而不需任何改變,如果你在Windows 9x/me上構(gòu)建,那么你必須在 ACE_ROOT\ace\config.h.的#include塊之前添加一行: #define ACE_HAS_WINNT4 0 這將在ACE中移掉一些WinNT/Win2K中特有的代碼。 6. 如果你希望使用MSVC自帶的標(biāo)準(zhǔn)C++頭文件(C++ Standard Draft 2種定義的iostream,cstdio…..),則應(yīng)該在 ACE_ROOT\ace\config.h.的#include塊之前添加一行: #define ACE_HAS_STANDARD_CPP_LIBRARY 1 7. 如果需要和MFC一起使用,增加如下定義到你的config.h文件中,注意,如果你想使用spawn一個(gè)新的線程,則必須保證使用THR_USE_AFX標(biāo)志來spawn線程。 #define ACE_HAS_MFC 1 缺省的,ACE工程使用MSVC運(yùn)行時(shí)的動(dòng)態(tài)DLL版本,你也可以選擇使用ACE的不關(guān)心運(yùn)行時(shí)庫(kù)的靜態(tài)(LIB)版本。我們選擇僅與動(dòng)態(tài)運(yùn)行時(shí)庫(kù)連接的原因在于基本上所有的NT機(jī)器上都會(huì)安裝這些庫(kù),而我們則可以因此而減小代碼的大小。如果你希望ACE與MFC的靜態(tài)版本連接,則可以在config.h中定義ACE_USES_STATIC_MFC。然而,如果你希望靜態(tài)的連接所有的庫(kù)(包括MSVC運(yùn)行時(shí)庫(kù)),就需要自己修改工程文件了。 8. 如果要構(gòu)建ACE的靜態(tài)版本,則需要在config.h中定義ACE_AS_STATIC_LIBS,此宏在那些希望使用ACE的靜態(tài)版本的應(yīng)用工程中也必須定義。 作為一個(gè)可選項(xiàng),你可以在 #include statement in ACE_ROOT\ace\config.h.之前添加一行: #define ACE_NO_INLINE 來取消函數(shù)內(nèi)聯(lián)從而減小靜態(tài)庫(kù)(和你的運(yùn)行碼)的大小。 9. ACE DLL和LIB庫(kù)的命名規(guī)則: 我們使用如下的規(guī)則明明使用MSVC的ACE的DLL和LIB文件。 "Library/DLL name" + (是靜態(tài)庫(kù)嗎 ? "s" : "") + (包含調(diào)試信息 ? "d" : "") + {".dll"|".lib"} 在MSVC環(huán)境中使用ACE的更多信息可以在這里找到。
|
-----------------------------------------------------------------------
一、安裝TAO,需要先編譯并安裝ACE。
二、ACE的編譯和安裝步驟見http://www.cs.wustl.edu/~schmidt/ACE_wrappers/ACE-INSTALL.html。TAO的編譯和安裝步驟見http://www.cs.wustl.edu/~schmidt/ACE_wrappers/TAO/TAO-INSTALL.html。如果你英文程度還可以的話,最好直接閱讀這兩篇文檔。說到底,中文文檔只是“權(quán)宜之計(jì)”;漢語(yǔ)并不太適合進(jìn)行邏輯性的表述。
但我還是把其中的一些段落編譯如下(VC 6.0 + ACE-5.2.1 + TAO-1.2.1):
ACE的編譯與安裝
一般規(guī)則
ACE中的許多特性可以通過在$ACE_ROOT/ace/config.h中定義一些宏來進(jìn)行修改。這些宏應(yīng)該總是在包括針對(duì)你的平臺(tái)的配置文件之前出現(xiàn)。
但是,如果你想要取消/重定義在針對(duì)特定平臺(tái)的配置文件中定義的宏,#undef應(yīng)該在配置文件之后出現(xiàn)。
如果你計(jì)劃在多種平臺(tái)上編譯ACE,你也許需要考慮克隆源碼樹。
步驟:
1. 將ACE發(fā)布文件解壓縮到某個(gè)目錄中,在其中將會(huì)創(chuàng)建含有所有文件的ACE_wrappers目錄。在下面的步驟中,ACE_wrappers目錄將以ACE_ROOT為名來指稱。
2. 在ACE_ROOT\ace目錄中創(chuàng)建一個(gè)名為config.h的文件,在其中包含:
#include “ace/config-win32.h”
3. 現(xiàn)在加載ACE的項(xiàng)目文件(ACE_ROOT\ace\ace.dsw)。
4. 其中的每個(gè)項(xiàng)目都含有若干不同的配置(可混合Debug/Release、MFC/Non-MFC、Static/Dynamic library版本)。你可以從中選擇你所需的配置,或是使用ace/config.h來進(jìn)行調(diào)整。
注意:如果你使用動(dòng)態(tài)鏈接庫(kù),在運(yùn)行使用ACE的程序時(shí),確定你在PATH中包括了ACE_ROOT\bin。
5. 如果你的系統(tǒng)平臺(tái)是WinNT或2000,那么無需任何改動(dòng)你就可以開始編譯了。如果是Windows 9x/Me,你需要在ACE_ROOT\ace\config.h中的#include語(yǔ)句之前增加:
#define ACE_HAS_WINNT4 0
6. 如果你想要使用MSVC標(biāo)準(zhǔn)C++頭(iostream、cstdio……),在ACE_ROOT\ace\config.h中的#include語(yǔ)句之前增加:
#define ACE_HAS_STANDARD_CPP_LIBRARY 1
7. 要與MFC一起使用ACE,再增加下面的定義:
#define ACE_HAS_MFC 1
注意如果你想要通過CWinThread派生新線程,一定要設(shè)置THR_USE_AFX。在缺省情況下,所有的ACE項(xiàng)目都使用DLL版本的MSVC運(yùn)行時(shí)庫(kù)。盡管如此,你仍然可以選擇使用static(LIB)版本的ACE庫(kù)。如果你想要將MFC作為靜態(tài)庫(kù)鏈接進(jìn)ACE,你可以在config.h文件中定義ACE_USES_STATIC_MFC。但如果你想要靜態(tài)鏈接所有的東西(包括MSVC運(yùn)行時(shí)庫(kù)),你就需要自己修改ACE的項(xiàng)目文件。
8. ACE的靜態(tài)版本是通過定義ACE_AS_STATIC_LIBS來編譯的。在鏈接靜態(tài)ACE庫(kù)的應(yīng)用項(xiàng)目中也應(yīng)該使用這個(gè)宏。
你也可以在config.h文件中增加
#define ACE_NO_INLINE
來取消函數(shù)內(nèi)聯(lián)并減小靜態(tài)庫(kù)(和你的可執(zhí)行程序)的大小。
9. ACE DLL和LIB的命名方案:
"Library/DLL名" + (是否為靜態(tài)庫(kù) ? "s" : "") + (是否啟用了Debugging ? "d" : "") + {".dll"|".lib"}
10. 配置完畢后編譯即可。選擇dll版本,編譯生成的dll文件在ACE_ROOT\bin中,相應(yīng)的lib文件在ACE_ROOT\ace中。
ACE測(cè)試
各測(cè)試程序在ACE_ROOT\tests中。在其中也有一個(gè)工作空間文件可用來編譯所有的測(cè)試程序(tests.dsw)。
一旦你編譯了所有測(cè)試程序(可使用批編譯),你可以運(yùn)行tests目錄中的perl腳本run_test.pl或批處理文件run_tests.bat來進(jìn)行所有測(cè)試。
TAO的編譯與安裝
確定VC的CL.EXE在你的訪問路徑上。設(shè)置ACE_ROOT或TAO_ROOT環(huán)境變量。例如:
set ACE_ROOT=C:\ACE_wrappers
TAO最好放置在ACE_wrappers(這也是缺省情況)。
1.確定ACE已經(jīng)編譯和安裝。
2.確定ACE_wrappers\bin已在“Tools|Options”中的“Executable Directories”中列出。如果在MSVC下使用TAO_IDL編譯器就需要進(jìn)行此設(shè)置。
3.加載tao\TAO.dsw,并編譯TAO庫(kù)。
4.要編譯Cubit測(cè)試,加載performance-tests\Cubit\TAO\IDL_Cubit\IDL_Cubit.dsw,并編譯客戶和服務(wù)器。
TAOACE.dsw
TAOACE.dsw是一個(gè)Visual C++ 5.0/6.0工作空間文件,它加載的項(xiàng)目包括ACE、TAO、TAO_IDL(編譯器)、gperf、orb服務(wù)庫(kù),以及一些單獨(dú)的可執(zhí)行程序(比如Naming Service,等等)。它可以用于編譯所有的用于編譯/運(yùn)行TAO應(yīng)用的文件。
三、我選擇編譯的是dll版本(Release),并在ACE的config.h文件中定義了“#define ACE_HAS_STANDARD_CPP_LIBRARY 1”。編譯后我所得到的ace.dll的大小是1.13MB,相應(yīng)的ace.lib的大小是1.77MB;TAO.dll的大小是1.47MB,相應(yīng)的TAO.lib的大小是2.74MB。所有文件約有 MB,包括源程序、編譯生成的中間文件,等等,但有些例子及服務(wù)我沒有編譯。
祝學(xué)有所成!
馬維達(dá)
-------------------------------------
將ACE與VC6集成在一起
一.打開 Tools>Options>Directories
加入以下內(nèi)容:
Executable File:
C:\ACE_wrappers\bin
Include File:
C:\ACE_wrappers\
C:\ACE_wrappers\TAO
C:\ACE_wrappers\TAO\orbsvcs
Library Files:
C:\ACE_wrappers\ace
C:\ACE_wrappers\TAO\tao
C:\ACE_wrappers\TAO\orbsvcs\orbsvcs
Source Files:
C:\ACE_wrappers\ace
C:\ACE_wrappers\TAO\tao
C:\ACE_wrappers\TAO\orbsvcs\orbsvcs
二.加入 C:\ACE_wrappers\bin 到系統(tǒng)環(huán)境變量 path中
三.設(shè)置系統(tǒng)變量
ACE_ROOT=C:\ACE_wrappers
TAO_ROOT=C:\ACE_wrappers\TAO