最近在windows 7 + vs 2008下搭建ACE的環境,遇到了若干問題,下面將其列出並給出相應的解決辦法(當然主要是google了)。
主要是參考文章:ACE 安裝指南及樣本 的步驟進行。
在編譯ACE工程檔案過程中,碰到的第一個問題是類似下面的錯誤:
1>e:/vrmarinemy/scene3d.h(91) : error C2146: 語法錯誤 : 缺少“;”(在標識符“m_TreeManager”的前面)
1>e:/vrmarinemy/scene3d.h(91) : error C4430: 缺少類型說明符 - 假定為 int。注意: C++ 不支援預設 int
1>e:/vrmarinemy/scene3d.h(91) : error C4430: 缺少類型說明符 - 假定為 int。注意: C++ 不支援預設 int
在網上查了下,問題搞了好久才解決,開始還懷疑過是作業系統的問題(我用的是windows 7),或者是工具vs 2008的不同的問題,甚至懷疑過是ACE源檔案中本身有問題。
最後在檢查的時候發現:安裝過程中有一步是,建立一個config.h檔案。加入一句話#include "config-win32.h"。
而原始碼ACE_wrappers/ace目錄下已經有這樣的一個檔案config.h,所以我之前就想當然的在該檔案中加了#include "config-win32.h";但是事實上這就是導致出現第一個問題的原因。我把該目錄下本來就有的config.h刪掉,重建立了這個檔案,並加入包含的標頭檔資訊,第一個問題就解決了。
碰到的第二個問題就是
在編譯ACE源檔案過程中出現錯誤:error C2471: 無法更新程式資料庫
在網上搜尋得到的解決方案是參考的這篇文章:
{
http://blog.csdn.net/zhuangshn/archive/2010/04/23/5520324.aspx
vs2005下的程式移到vs2008中,出現error C2471: 無法更新程式資料庫“d:/Work/ Project/FBReader/debug/vc90.pdb”
fatal error C1083: 無法開啟程式資料庫檔案:“d:/Work/ Project/FBReader/debug/vc90.pdb”: No such file or directory ..
解決方案:修改項目屬性 右擊項目 --> "屬性”
1. “C/C++” --> "常規” -->”調試資訊格式” 設定為 “C7 相容(/Z7)”
2. “C/C++” --> "代碼產生” -->”啟用字串池” 設定為 “是(/GF)”
3. “連結器” --> "調試” -->”產生調試資訊” 設定為 “是(/DEBUG)”
}
編譯完成之後就是編寫自己的工程項目以便測試產生的ACE庫檔案是否可以供自己的應用程式使用了,
建立一個工程ACETest1,原始碼如下:
#include "stdafx.h"<br />#include <ace/OS.h><br />#include <ace/Task.h><br />class HA_CommandHandler : public ACE_Task_Base<br />{<br />public:<br /> virtual int svc(void)<br /> {<br /> ACE_DEBUG((LM_DEBUG,<br /> ACE_TEXT("(%t) Handler Thread running/n")));<br /> ACE_OS::sleep(4);<br /> return 0;<br /> }<br />};<br />//int _tmain(int argc, _TCHAR* argv[])<br />int ACE_TMAIN(int argc, ACE_TCHAR *[])<br />{<br /> ACE_DEBUG((LM_DEBUG,<br /> ACE_TEXT("(%t) Main Thread running/n")));<br /> HA_CommandHandler handler;<br /> int result = handler.activate();<br /> ACE_ASSERT(result == 0);<br /> handler.wait();<br /> return 0;<br />}
在編譯該項目的時候,要配置
右鍵該項目-屬性, 配置屬性->連結器->常規->附加庫目錄"C:/1 work/ALLOCS/source code/ACE_wrappers/ACE_wrappers/lib"
配置屬性->連結器->輸入->附加依賴項,添入ACEd.lib
在編譯ACE庫 過程中還有個問題要注意的是(可能使用的是window 7系統+vs2008的緣故吧,記得搜尋到過好像是系統bug):右鍵ACE項目-屬性, 配置屬性->連結器->常規->啟用增量連結,設定為否(/INCREMENTAL:NO)。注意:只是在編譯ACE等庫項目的時候需要這麼設定,而自己建立的工程項目不需要設定。
否則會在連結的過程中報錯:
1>正在連結...<br />1>LINK : 沒有找到 C:/1 work/ALLOCS/source code/ACE_wrappers/ACE_wrappers/ace/Debug/ACETest1.exe 或上一個增量連結沒有產生它;正在執行完全連結<br />1>ACETest1.obj : error LNK2019: 無法解析的外部符號 "__declspec(dllimport) public: int __thiscall ACE_Main_Base::run(int,char * * const)" (__imp_?run@ACE_Main_Base@@QAEHHQAPAD@Z),該符號在函數 _main 中被引用<br />1>ACETest1.obj : error LNK2019: 無法解析的外部符號 "__declspec(dllimport) public: __thiscall ACE_Main_Base::ACE_Main_Base(void)" (__imp_??0ACE_Main_Base@@QAE@XZ),該符號在函數 "public: __thiscall ACE_Main::ACE_Main(void)" (??0ACE_Main@@QAE@XZ) 中被引用<br />1>ACETest1.obj : error LNK2019: 無法解析的外部符號 "__declspec(dllimport) public: virtual __thiscall ACE_Main_Base::~ACE_Main_Base(void)" (__imp_??1ACE_Main_Base@@UAE@XZ),該符號在函數 "public: virtual __thiscall ACE_Main::~ACE_Main(void)" (??1ACE_Main@@UAE@XZ) 中被引用
否則可能出現類似下面的錯誤:
LINK : 沒有找到 C:/Documents and Settings/ztne/My Documents/Visual Studio 2005/Projects/DirectXStudy/Debug/Draw.dll 或上一個增量連結沒有產生它;正在執行完全連結
還有就是在產生該項目之前還要設定項目依賴項,右鍵 ACETest1- 項目依賴項,項目ACETest1 依賴於項目 ACE。
右鍵該項目,並完成項目的產生。
但是在運行該項目的時候,又出現了:無法啟動此程式,因為電腦中丟失ACEd.dll。嘗試重新安裝此程式以解決此問題。
當時沒有找到解決的方法。但是知道是由於環境變數設定的原因,把產生的ACETest1.exe拷貝到產生ACEd.dll的目錄下,運行沒有問題。
自己環境變數設定也沒有問題啊,
1.在作業系統添加一個名為ACE_ROOT的系統內容變數,值為剛才ace的源檔案路徑C:/1 work/ALLOCS/source code/ACE_wrappers/ACE_wrappers
2.添加系統Path環境變數,值為%ACE_ROOT%/lib,這樣才能保證系統能找到ace產生的動態串連庫。
但是編譯產生後總出現上述的錯誤。
第二天重啟後發現程式編譯產生並啟動並執行時候沒有問題了,原來我是在開啟vs2008之後,才設定的系統內容變數,只有重啟vs2008,設定的系統內容變數才會生效。
至此,終於完成了ACE的環境搭建。