本文分2部分 第1部分:怎樣安裝ACE(其實就是怎樣編譯) 第2部分:怎樣使用ACE(其實就是把ACE原始碼裡的1個例子搬出來,然後介紹了下怎麼使用)
-----------------------------------第1部分:怎樣安裝ACE(其實就是怎樣編譯)-----------------------------------
(1)這個ACE的首頁非常的繞.先看下網上摘抄的
首頁
ACE的首頁為:http://www.cs.wustl.edu/~schmidt/ACE.html,在這裡可獲得最新版本的ACE以及其他相關資源。
相關網站:
ACE開發人員 http://www.acejoy.com/
Douglas Schmidt's Home Page http://www.cs.wustl.edu/~schmidt
ACE-5.4+TAO-1.4+CIAO-0.4 Documentation http://www.huihoo.com/ace_tao/ACE-5.4-html/html/index.html
產品首頁 。ACE - The ADAPTIVE Communication Environment http://www.cs.wustl.edu/~schmidt/ACE.html
。JACE - Java版本的ACE http://www.cs.wustl.edu/~eea1/JACE.html
。TAO - Real-time CORBA with TAO(TM) (The ACE ORB) http://www.cs.wustl.edu/~schmidt/TAO.html
。CIAO - Component-Integrated ACE ORB http://www.cs.wustl.edu/~schmidt/CIAO.html
。JAWS - 高效能、自適配的Web伺服器,使用ACE提供的構架組件和模式構建,JAWS被構造成“構架的構架” http://www.dre.vanderbilt.edu/JAWS/
。ZEN - JAVA實現的即時ORB http://zen.ece.uci.edu/
。POSIX ACE - (PACE)項目是為輕量級系統設計的提供的作業系統抽像層 http://www.cs.wustl.edu/~schmidt/ACE_wrappers/PACE/docs/www/ 相關資源和項目: The CORBA & CORBA Component Model (CCM) Page http://ditec.um.es/~dsevilla/ccm/
OpenCCM - The Open CORBA Component Model Platform http://openccm.objectweb.org/
starccm, an CORBA Component Model research project(including OTS and PSS), funded by Chinese 863 Hi-tech research program. Core designer/core developer. http://sourceforge.net/projects/starccm/
Agent and Distributed Objects Quality of Service (QoS) http://www.atl.external.lmco.com/projects/QoS/
POSA1,POSA2文檔 http://www.huihoo.com/download/ace-tao/posa.ppt http://www.huihoo.com/download/ace-tao/posa2.ppt
(2)參考完上面的網站後,第1次用的人可能都分不清是非了.下面就1步1步傻瓜式的操作弄清
第1步:去這個網站下載http://download.dre.vanderbilt.edu/
下載ACE-6.0.0.tar.gz 這個就可以了(上面有很多,按需所選了,第1次用的話,先將就用這個吧)
第2步:下完後解壓到D:\ACE_wrappers_6_0_0
可能第1次看,會有些不明白這些是做什麼的,下面專門從網上摘抄的,做了一下簡單說明
ACE_wrappers的子目錄中大致包含7個目錄:分別為:
o ace 包含ACE工具包的源碼
o bin含有許多有用的公用程式
o apps 包含許多基於ACE的應用程式,比如Gateway訊息路由
o docs 含有與ACE的各個方面的有關資訊,比如它的編碼指導方針
o examples 包含很多例子,示範怎麼使用ACE類和架構
o tests含有ACE的迴歸測試套件
第3步編譯
1.在D:\ACE_wrappers_6_0_0\ace目錄中建立一個標頭檔,命名為config.h,其內容為: #include "ace/config-win32.h"(必選項)
2.在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即可. 備忘:我這裡用的是VS2010中文版,在VC++中載入ACE的工程檔案(ACE_ROOT \ace\ace_vc10.sln),可能稍微與上面有些區別,但是大致意思同上面一樣 。另外可能對這裡的ACE_ROOT感到疑惑,下面有介紹。先看下批產生怎麼樣做,
點產生->批產生->選上win32(如果系統是64位,就選X64)->產生或重建
編譯成功後(大概要編譯30分鐘,視機器效能了),在D:\ACE_wrappers_6_0_0\lib這個路徑下會產生引入庫(.lib)與連結庫(.dll),
注意:liunx下的DLL動態連結程式庫是.so尾碼名 到這裡就安裝完成了,其實就是編譯了.沒什麼.
ACE和VS的比較:VS是個編譯工具,ACE是個庫
區別就是:VS給你編譯好了,直接寫代碼即可,而ACE就是要使用者自己編譯工具與設定系統內容(整的很深奧似的,其實是把一個簡單的東西整的很複雜而已,不過ACE是跨平台的,能理解),看完下面怎樣使用後,你就會對這整個流程有個初步瞭解
-----------------------------------第2部分:怎樣使用ACE-----------------------------------
一共2個例子: 例1,是ACE上的原始碼 例2,就是自己另外寫的
--------------------舉例1:這裡以D:\ACE_wrappers_6_0_0\examples下的Logger案例--------------------
先從ACE目錄中拷貝到別的地方(不要放在原版目錄中,因為原版是引用檔案與庫檔案的地方).做下測試
用VS2010開啟
報錯1:
3>InitializeBuildStatus: 3> 正在建立“Debug\Logger_Simple_Server_vc10\I386\Logger_Simple_Server.unsuccessfulbuild”,因為已指定“AlwaysCreate”。 3>ClCompile: 3> Logging_Acceptor.cpp 3>f:\vc測試\logger\simple-server\logging_acceptor.cpp(3): fatal error C1083: 無法開啟包括檔案:“ace/WFMO_Reactor.h”: No such file or directory 3> Logging_Handler.cpp 3>f:\vc測試\logger\simple-server\logging_handler.cpp(3): fatal error C1083: 無法開啟包括檔案:“ace/Log_Msg.h”: No such file or directory 3> server_loggerd.cpp 3>f:\vc測試\logger\simple-server\server_loggerd.cpp(10): fatal error C1083: 無法開啟包括檔案:“ace/Get_Opt.h”: No such file or directory 解決辦法:
在屬性中放上
包含目錄 D:\ACE_wrappers_6_0_0
庫目錄 D:\ACE_wrappers_6_0_0\lib
當然,你若不想拷貝到別的目錄,直接在ACE原版目錄下的那個案例下編譯也行,它不會報這個錯誤,因為它路徑,已經指定好了../../../lib,上層目錄的上層目錄的上層目錄的下層目錄lib,所以直接編譯不會報錯(可參考)
報錯2:
說找不到ACEd.dll,
這個問題:解決辦法:是從源頭找起
首先:要明白DLL的曆史
摘抄:孫鑫<<VC++深入詳解>>第19章701頁
Windows API中所有的函數都包含在DLL中,其中有3個最重要的DLL.
Kernel32.dll,User32.dll與GDI32.dll 靜態庫和動態庫
靜態庫
函數和資料被編譯進一個二進位檔案(通常副檔名為.lib).在使用靜態庫的情況下,在編譯連結可執行檔時,連結器從庫中複製這些函數和資料並把它們和應用程式的其它模組組合起來建立最終的可執行檔(.exe檔案).當發布產品時,只需要發布這個可執行檔,並不需要發布被使用的靜態庫
動態庫
在使用動態庫的時候,往往提供兩個檔案:一個引入庫(.lib)檔案和一個DLL(.dll)檔案.雖然引入庫的尾碼名也是"lib",但是,動態庫的引入庫檔案與靜態庫檔案有著本質區別,對一個DLL來說,其引入庫檔案(.lib)包含該DLL匯出的函數和變數的符號名,而.dll檔案包含該DLL實際的函數和資料.在使用動態庫的情況下,在編譯連結可執行檔時,只需要連結該DLL的引入庫檔案,該DLL中的函數代碼和資料並不複製到可執行檔,直到可執行程式運行時,才去載入所需要的DLL,將該DLL映射到進程的地址空間中,然後訪問DLL中匯出的函數.這時,在發布產品時,除了發布可執行檔以外,同時還要發布該程式將要調用的動態連結程式庫
其次,此原始碼的程式預設的運行庫是多線程調試DLL,
這裡很明顯是動態庫,上面也講動態庫的基礎.這裡主要是包含LIB.目錄已經指的很清楚,上面已說了.
編譯連結時也能正常通過,這說明LIB並沒有問題.很明顯的.這個DLL在ACE第1次"安裝的時候",就已經固定了.
解決辦法: 方法1.把這個ACEd.dll放到與.exe的同一目錄,這樣運行可執行程式時不會報錯了
方法2.把這個ACEd.dll放到C:\WINDOWS\system32目錄下
方法3.改系統參數,以下是摘抄的
無法找到動態連結程式庫aced.dll於指定的路徑? 為系統變數PATH加上D:\ACE_wrappers\bin 第1次看不太明白.沒關係.按照下面的傻瓜式步驟.看完,你就會了
案頭->我的電腦->屬性->進階->環境變數,這時會出現2個選項
第1個:Administrator的使用者變數--->這個的意思是只為此超級管理員設定,單獨的使用者佈建,如果有來賓使用者,就是單獨的來賓使用者
第2個:系統變數--->這個是全域的.所有不管是超級管理員還是來賓使用者
這裡選擇第2個系統變數->找到Path,開啟彈出變數名:Path 變數值:.....
增加格式如下;+路徑
;D:\ACE_wrappers_6_0_0\lib
拷貝這個到最後即可,:
任何一種方法都能運行程式.
到這裡也順便講講ACE_ROOT,為什麼要在系統變數中添加這個,也添加了個ACE_ROOT2,做參考.其實它無非是一個路徑名而已.但是它的最重要功能是可移植性.因為ACE的設計就是跨平台,所以添加這個系統變數是很正常的
摘抄:
環境設定
你可能打算註冊一些環境變數指向你安裝OGRE的根目錄,這樣你可以把你的所有路徑與這個變數關聯。這樣的話當你移動這些東西到別處或者別的機器上時可以非常簡單的重新置放這些路徑。關於查看與修改環境變數,請參閱以下文檔:Windows, Linux以及 Mac OSX。
- 如果你下載並安裝了先行編譯版(precompiled) OGRE SDK,那你應該已經擁有一個名為'OGRE_HOME'的環境變數了,它指向了你安裝OGRE的那個檔案夾。如果沒有的話,你也許是在系統的另一個使用者下安裝的OGRE,那麼手動定義一下 OGRE_HOME 環境變數就行了。
- 如果你下載的是原始碼版本,你應該註冊一個新的環境變數 OGRE_SRC 指向OGRE原始碼中的'ogrenew'檔案夾。
這個就是為什麼要加系統變數ACE_ROOT的原因!
--------------------舉例2:--------------------
例子2:會比例子1標準一點.一步一步前進
首先:系統配置環境:
變數名 ACE_ROOT 變數值 D:\ACE_wrappers_6_0_0
變數名 Path 變數值 在後面增加;%ACE_ROOT%\lib
其它都基本上同上面一樣.不過建議一點:庫路徑最好放統一.為了體現可方便跨平台性(比如公司有一台寫了一個程式,要能直接拷貝到宿舍就能直接用,不需要在配置系統內容)
在VS中配置時,
(2)VS中配置環境--->注意在Debug與Release版本各配置一次(配置方法一樣),這樣以後切換時,就不需要配來配去了
正確配置:
包含目錄:$(ACE_ROOT)
包含庫:$(ACE_ROOT)\lib
錯誤配置:注意$與%別弄混了
包含目錄:%ACE_ROOT
包含庫:%ACE_ROOT%\lib
注:這個和Windows的Hello World!有著本質的區別.這個是用具有跨平台的庫寫出來的
代碼如下:
// login.cpp : 定義控制台應用程式的進入點。 // #include "stdafx.h"
#ifdef _DEBUG #pragma comment (lib,"ACEd.lib") #else #pragma comment (lib,"ACE.lib") #endif
#include "ace/OS_main.h" #include "ace/Service_Config.h"
int ACE_TMAIN (int argc , ACE_TCHAR *argv[]) { ACE_OS::printf("Hello World!\n"); return 0; }
附註1:本文講的是最基礎的.比如怎麼安裝,與怎麼編譯ACE內建的代碼,並且給出怎樣自己寫出一個Hello World!先認識一下,1步1步來認識它
轉自:http://hi.baidu.com/vc_net/item/701874a761b2cddb5af19147