1. 程式人生 > >使用VisualStudio完成自動化C++程式碼生成和編譯工作(GacUI)

使用VisualStudio完成自動化C++程式碼生成和編譯工作(GacUI)

    GacUI終於進入製作dll的階段了。昨天上傳了一個新的工程,在Vczh Library++3.0(E:\Codeplex\vlpp\Workspace\Tools\Release\SideProjects\GacUI\GacUI.sln)。這裡面一共有三個工程,有兩個是工具,一個是dll。

    為了編譯出帶反射的控制元件庫,因此每一個控制元件都可以獲得一個ITypeDescriptor物件。但是控制元件庫一共有幾十個類上千個函式,我不可能一個一個去實現的(請想想實現IDispatcher的時候)。根據上一篇部落格討論過技術,我將使用一個程式來讀pdb生成C++程式碼。詳細的計劃如下:

    1:製作一個_GacPDB工程。這是一個exe,但是是沒用的,唯一的用處就是他引用了GacUI.dll所需要的所有原始碼,然後靠編譯器產生PDB檔案。
    2:製作一個_TranslatePDBtoXML工程。這是一個exe,從PDB抽取類宣告。
    3:製作一個_TranslateXMltoCode。顧名思義,不過現在還沒做,原理是一樣的。
    4:GacUI.dll。這個dll包含了所有的控制元件的實現,還有_TranslateXMLtoCode產生的所有程式碼。

    現在我的目標是,先編譯_Translate*工程,然後編譯_GacPDB產生pdb後自動呼叫它們,生成程式碼結束之後開始合併編譯GacUI.dll。所有的這些東西都需要在VisualStudio的“Rebuild Solution”裡面完成。為了完成這個目標,我建立這些工程之後,按照下面的方法修改了工程屬性:  1
 _TranslatePDBtoXML:
 2     post build action:
 3         copy $(ProjectDir)msdia100.dll $(SolutionDir)$(Configuration)\msdia100.dll
 4 _GenPDB:
 5     references:
 6         _TranslatePDBtoXML
 7     post build action:
 8         $(SolutionDir)$(Configuration)\_TranslatePDBtoXML.exe $(SolutionDir)Debug\_GenPDB.pdb $(SolutionDir)_GenPDB.xml
 9 GacUI:
10     references:
11         _GenPDB
    1:工程A引用了工程B的話,那麼只有當B完全編譯好之後才會編譯A。因此上面的配置將阻止三個工程平行編譯,強制他們按照_TranslatePDBtoXML、_GenPDB和GacUI的順序來。
    2:_TranslatePDBtoXML編譯好之後,會把它依賴的msdia100.dll複製到編譯出來的exe旁邊,以供接下來呼叫。
    3:_GenPDB編譯好之後,pdb已經產生了。這個時候它會自動呼叫上一步編譯出來的_TranslatePDBtoXML,讀取pdb,輸出xml
    4:(接下來要做的)呼叫_TranslateXMLtoCode,輸入xml,輸出C++程式碼
    5:這個時候,生成的C++程式碼已經就緒了,所以開始編譯GacUI。

    附加的好處還有一個。因為_GenPDB引用了GacUI的cpp,所以當GacUI的原始碼修改的時候,_GenPDB也會感應到,從而在下次編譯GacUI的時候先開始編譯_GenPDB。並且因為GacUI依賴了_GenPDB,所以_GenPDB仍然會先編譯。而且這種依賴關係是無害的,因為_GenPDB沒有輸出lib,因此GacUI.dll在執行的時候完全不需要_GenPDB.exe的存在。

    好了。那把一個個的cpp檔案新增到_GenPDB也是在太麻煩了,所以我投機取巧了一下:  1
 #include "..\..\..\..\..\Candidate\GUI\GUI\Controls\GuiApplication.cpp" 2 #include "..\..\..\..\..\Candidate\GUI\GUI\Controls\GuiBasicControls.cpp" 3 #include "..\..\..\..\..\Candidate\GUI\GUI\Controls\GuiListControls.cpp" 4 #include "..\..\..\..\..\Candidate\GUI\GUI\Controls\GuiTextControls.cpp" 5 #include "..\..\..\..\..\Candidate\GUI\GUI\Controls\GuiWindowControls.cpp" 6 //--------------------------------------------------------------- 7 #include "..\..\..\..\..\Candidate\GUI\GUI\Controls\ExtendedControls\GuiComboControls.cpp" 8 #include "..\..\..\..\..\Candidate\GUI\GUI\Controls\ExtendedControls\GuiContainerControls.cpp" 9 #include "..\..\..\..\..\Candidate\GUI\GUI\Controls\ExtendedControls\GuiListViewControls.cpp"10 #include "..\..\..\..\..\Candidate\GUI\GUI\Controls\ExtendedControls\GuiMenuControls.cpp"11 #include "..\..\..\..\..\Candidate\GUI\GUI\Controls\ExtendedControls\GuiTextListControls.cpp"12 #include "..\..\..\..\..\Candidate\GUI\GUI\Controls\ExtendedControls\GuiTreeViewControls.cpp"13 //---------------------------------------------------------------14 #include "..\..\..\..\..\Candidate\GUI\GUI\Controls\Styles\GuiCommonStyles.cpp"15 #include "..\..\..\..\..\Candidate\GUI\GUI\Controls\Styles\GuiWin7Styles.cpp"16 //---------------------------------------------------------------17 #include "..\..\..\..\..\Candidate\GUI\GUI\GraphicsElement\GuiGraphicsComposition.cpp"18 #include "..\..\..\..\..\Candidate\GUI\GUI\GraphicsElement\GuiGraphicsElement.cpp"19 #include "..\..\..\..\..\Candidate\GUI\GUI\GraphicsElement\GuiGraphicsEventReceiver.cpp"20 #include "..\..\..\..\..\Candidate\GUI\GUI\GraphicsElement\GuiGraphicsHost.cpp"21 #include "..\..\..\..\..\Candidate\GUI\GUI\GraphicsElement\GuiGraphicsTextElement.cpp"22 //---------------------------------------------------------------23 #include "..\..\..\..\..\Candidate\GUI\GUI\NativeWindow\GuiNativeWindow.cpp"24 #include "..\..\..\..\..\Candidate\GUI\GUI\NativeWindow\Windows\WinNativeWindow.cpp"25 //---------------------------------------------------------------26 #include "..\..\..\..\..\Candidate\GUI\GUI\Reflection\GuiTypeDescriptor.cpp"27 //---------------------------------------------------------------28 #include "..\..\..\..\..\Library\Basic.cpp"29 #include "..\..\..\..\..\Library\Exception.cpp"30 #include "..\..\..\..\..\Library\String.cpp"31 #include "..\..\..\..\..\Library\Threading.cpp"32 #include "..\..\..\..\..\Library\Collections\Operation.cpp"33 //---------------------------------------------------------------34 #include <Windows.h>35 36 int CALLBACK WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int CmdShow)
37 {
38 return0;
39 }