客户端DDK编译环境配置说明
客戶端DDK編譯環境配置說明
?
概要
文檔主要說明DDK編譯環境的部署,如何使用該環境進行客戶端代碼的編譯,環境中一些主要命令、如何擴展一些命令。以及在從VC環境下移植過來后,代碼需要改進的一些描述。文章將著重對相關模塊下的sources makefile進行描述。
?
主要分以下五個部分,各個部分的詳細敘述請參見各章節。
1.??????DDK build server的部署
2.??????DDK環境目錄的介紹
3.??????DDK編譯工具和操作介紹
4.??????編譯過程描述以及tang工程編譯分析
5.??????VC源代碼移植一些常見編譯錯誤
6.??????一些遺留移植和完善工作
?
DDK build server的部署
DDK build server是指存在ddk build環境的服務器,可供每個開發人員下載到自己的開發機器,經過簡單的配置就能成為本地ddk編譯換進的一套機制。DDKbuild server可供公司各個項目組使用,方便的下載,配置并執行編譯功能。
?
目前沒有ddk buildserver部署,大家可以從機器192.168.12.103的共享目錄中進行下載。
?
DDK環境目錄的介紹
?
從上圖中可以看到紅圈標識的幾個文件和文件夾,下面一一進行介紹:
Bin目錄:包含了對應系統平臺下的整個環境的工具和編譯命令,已經進行環境設置的bat等。例如:cl.exe,mc.exe,midl.exe,rc.exe包括編譯命令build.exe等。
?
Inc目錄:包含了整個環境中的頭文件,其中包含的子目錄crt,atl,wtl,ddk,api,mfc等包含了各種不同編程框架,crt以及系統sdk的頭文件。各個子目錄都,對應與相應的環境變量一一對應:
Crt?$( CRT_INC_PATH) = ddk下載目錄\inc\crt
Sdk?$( SDK_INC_PATH)= ddk下載目錄\inc\api
Wtl?$( WTL_INC_PATH)= = ddk下載目錄\inc\wtl80
…
?
Lib目錄:包含了整個編譯環境下的所有lib文件(除用戶lib),其中包含的子目錄atl,crt,mfc,以及不同操作系統對應的庫目錄。各個子目錄與相應的環境變量一一對應:
Crt?$(CRT_LIB_PATH)= ddk下載目錄\lib\crt\*
Sdk?$( SDK_LIB_PATH)= ddk下載目錄\lib\wxp\*
…
?
Src目錄:源代碼路徑,開發人員將需要編譯的代碼都放在src目錄下。
?
Dir文件:是整個環境非常重要的一個文件,dir中記錄了當前文件夾需要編譯的子文件夾,并以一定格式組織,作為ddk編譯時目錄路由的憑證。
?
所有在dir目錄中的文件夾都會被編譯,可以通過刪除在dir文件中的目錄記錄來排除編譯某個文件夾。
?
WDK build 工具和操作
下表列出了DDK環境中的一些工具盒對應處理的文件類型。
| Description | Component | Consumes |
| Build utilities | build.exe nmake.exe | sources files, dirs files makefile, makefile.def, makefile.inc |
| File that controls the build environment | SetEnv.bat | ? |
| Files that identify what is to be built | dirs, sources, and? makefile files | ? |
| Compiler | cl.exe | .cpp files, .c files, .h files |
| Linker | link.exe | .obj files, .lib files |
| Supporting tools | midl.exe rc.exe binplace.exe stampinf.exe mofcomp.exe | .idl files .rc files ? .inx files .mof files |
| Windows Auto Code Review (OACR) tool | oacrcl.exe, oacrlink.exe | oacr.ini, oacruser.ini |
其中OACR工具是用來做代碼的靜態分析,可以幫助我們規范代碼,排查一些代碼中的問題。
?
編譯過程描述以及tang工程編譯分析
環境的設置:命令行窗口的啟動,實際上是使用了以下的一段命令語句:
C:\Windows\System32\cmd.exe /k D:\ddk_build\bin\setenv.batD:\ddk_build\ chk x86 WinXP
這段語句實際打開一個命令行窗口,并且執行Setenv.bat文件從而設置了一系列的環境變量。在目錄介紹章節當中提到的環境變量都在這個時候設置好的。
?
編譯過程:build.exe實際執行編譯的整個過程,大致過程可表示為:
?
Scan:掃描工程文件。編譯過程的第一步,掃描整個工程中的文件樹(dir文件起作用)并且決定是不是進行目標編譯。在掃描結束后,Build工具會根據掃描結果,得到目標的類型,以及決定整個編譯過程的細節,包括有哪些步驟需要執行比如pass0,pass1,pass2,并且各個過程的參數有哪些等等。總之就是編譯任務執行前的所有準備工作。
?
Pass0:處理源代碼。在這個過程中NMAKE會調用一個或多個的工具去處理源代碼,比如:
·????????Microsoft Interface DescriptionLanguage (MIDL) compiler (Midl.exe).
·????????Other WDK support tools such asthe Stamp INF tool (Stampinf.exe) and Managed Object Format (MOF) compiler(Mofcomp.exe).
·????????The BinPlace utility(Binplace.exe) to place files.
?
Pass1:編譯obj,lib文件。編譯源文件生成object文件和庫文件。以下的工具會被調用或可能被調用:
·????????The C/C++ compiler (Cl.exe).
·????????The Resource compiler (Rc.exe).
·????????Other WDK support tools such asthe Stampinf.exe and Mofcomp.exe.
·????????The BinPlace utility(BinPlace.exe) to place files.
·????????The linker might be calledthrough the OACR wrapper (Oacrlink.exe).
?
下表表示了一些在pass1過程中可能產生的一些目標文件:
| TARGETTYPE value in sources file | Description | Files input to | Files created by pass 1 | Is target complete after pass 1? |
| LIBRARY | Static library | .h, .c, .cpp | .lib | Yes |
| DYNLINK | Dynamic link library or user-mode driver | .h, .c, .cpp | .lib (import library) | No |
| DRIVER | Kernel-mode driver | .h, .c | .obj | No |
?
Pass2:生成最終的目標文件。在這個過程中linker會將pass1中生成的中間文件鏈接成最終的目標,比如可執行程序,dll,驅動程序等。以下工具會被使用或可能被使用到:
·????????Linker (Link.exe).
·????????Resource compiler (Rc.exe).
·????????BinPlace utility(BinPlace.exe), to place files.
·????????The linker might be calledthrough the OACR wrapper (Oacrlink.exe).
?
Binplace文件:在pass0,1,2三個過程的每個結束時,如果我們在sources文件中定義了對應的PASS0_BINPLACE, PASS1_BINPLACE,PASS2_BINPLACE,那么BinPlace.exe都會被調用,并按照sources中定義的規則進行文件的binplace。具體請參見sources文件分析部分。
?
Tang工程解析
在ddk環境下的編譯過程都嚴格的按照上面的步驟進行編譯,下面將列舉tang項目中的三個不同類型的工程lib,dll,exe 進行分析,主要是分析工程中的Sources文件。
?
SOURCES文件用于描述其所在目錄下,有哪些文件參與編譯,編譯的結果應該是什么(是一個lib還是一個sys還是一個可執行程序),輸出目錄在哪里,要傳遞給編譯器的各種定義和選項分別是什么,等等。由一個SOURCES文件描述的其實就是一個單獨的工程,Build最后會參照SOURCES文件的設置,產生一個指定的目標文件(dll ? lib ? exe ?sys ?)完全依賴于SOURCES文件的寫法。
?
CommonLib工程:
TARGETNAME=Commonlib????????????? //Lib名稱
TARGETTYPE=LIBRARY???????????????? //指定工程的類型為Lib工程
?
C_DEFINES= $(C_DEFINES) -DUNICODE -D_UNICODE??? //指定為unicode編碼
MSC_WARNING_LEVEL=/W1 /WX???????? //指定警告錯誤級別
?
USE_MSVCRT=1???????????????????????????????????? //使用crt
USE_STL=1???????????????????????????????????????????? //使用STL
USE_ATL=1???????????????????????????????????????????? //使用ATL
STL_VER=70?????????????????????????????????????????? //指定STL版本為7.0
?
MINWIN_SDK_LIB_PATH=$(SDK_LIB_PATH)
INCLUDES=? $(COMMON_DIR)\Inc;\
???????????????????? $(COMMON_DIR)\Support\Inc;\
???????????????????? $(CRT_INC_PATH);\
???????????????????? $(SDK_INC_PATH);\
???????????????????? $(SDK_INC_PATH)\crt\stl70;\????????????????????????? //工程中引用頭文件目錄
????????????????????
TARGETLIBS=???? \????????????????????????????????????????????????????????????? //工程中引用的lib庫
???????????????????? $(SDK_LIB_PATH)\user32.lib????? \
???????????????????? $(SDK_LIB_PATH)\Kernel32.lib??? \
???????????????????? $(SDK_LIB_PATH)\Advapi32.lib??? \
???????????????????? $(SDK_LIB_PATH)\comctl32.lib? \
???????????????????? $(SDK_LIB_PATH)\gdi32.lib??? \
???????????????????? $(SDK_LIB_PATH)\winspool.lib??? \
???????????????????? $(DDK_LIB_PATH)\nt.lib\
???????????????????? $(SDK_LIB_PATH)\shell32.lib\
???????????????????? $(SDK_LIB_PATH)\ole32.lib\
???????????????????? $(SDK_LIB_PATH)\oleaut32.lib\
???????????????????? $(SDK_LIB_PATH)\psapi.lib\
???????????????????? $(SDK_LIB_PATH)\msxml2.lib\
???????????????????? $(SDK_LIB_PATH)\shlwapi.lib\
?????????????????????????????????????????
SOURCES=Commonlib.idl \
????????????? RegistryFun.cpp\
????????????? unzip.cpp\
????????????? Util.cpp\
????????????? WinObject.cpp\
????????????? XmlWrapper.cpp\
????????????? zip.cpp\
????????????? ElementHelper.cpp\???????????????????????????????????????? //需要編譯的源文件列表
?
TARGET_DESTINATION=Target\chk????????????????????????????? //binplace的目的地址
PASS0_BINPLACE=-:DEST Common\Inc$(OBJ_PATH)\$(O)\$(TARGETNAME).h??? //PASS0 binplace
PASS2_BINPLACE=$(OBJ_PATH)\$(O)\$(TARGETNAME).lib????? //PASS2binplace
?
其中pass0 的binplace使用了:DEST改變binplace的目的地址,如果定義了TARGET_DESTINATION,默認使用該定義的地址為binplace的目的地址。但是可使用:DEST改寫該值。但必須嚴格按照語法進行定義。Pass2使用默認的目標地址。
?
所以工程編譯過程中,在sources的當前目錄中生成一些中間文件,有幾個是產生的log文件,可以幫助分析編譯過程中的一些參數傳遞和一些錯誤等。具體生成的中間文件及文件夾如下圖,其中在文件夾類似objchk_wxp中生成的是obj,lib,res,manifest等中間文件:
當然最終的目標文件也會生成在那個目錄中,但是如果進行了binplace的設置,binplace.exe會將設定的文件移動到目標目錄下。
?
LogDLL工程:
TARGETNAME=LogDll???????????????????? //Lib名稱
TARGETTYPE=DYNLINK??????????????? //指定工程的類型為動態鏈接庫工程
?
C_DEFINES= $(C_DEFINES) -DUNICODE -D_UNICODE -DWIN32
MSC_WARNING_LEVEL=/W1 /WX
?
USE_MSVCRT=1
USE_STL=1
USE_ATL=1
STL_VER=60
?
MINWIN_SDK_LIB_PATH=$(SDK_LIB_PATH)
INCLUDES=? $(COMMON_DIR)\Inc;\
???????????????????? $(CRT_INC_PATH);\
???????????????????? $(SDK_INC_PATH);\
???????????????????? $(SDK_INC_PATH)\crt\stl60;\
????????????????????
TARGETLIBS=???? \
???????????????????? $(SDK_LIB_PATH)\user32.lib????? \
???????????????????? $(SDK_LIB_PATH)\Kernel32.lib??? \
???????????????????? $(SDK_LIB_PATH)\Advapi32.lib??? \
???????????????????? $(SDK_LIB_PATH)\comctl32.lib? \
???????????????????? $(SDK_LIB_PATH)\gdi32.lib??? \
???????????????????? $(SDK_LIB_PATH)\winspool.lib??? \
???????????????????? $(DDK_LIB_PATH)\nt.lib\
???????????????????? $(SDK_LIB_PATH)\shell32.lib\
???????????????????? $(SDK_LIB_PATH)\ole32.lib\
???????????????????? $(SDK_LIB_PATH)\oleaut32.lib\
???????????????????? $(SDK_LIB_PATH)\psapi.lib\
???????????????????? $(SDK_LIB_PATH)\msxml2.lib\
?????????????????????????????????????????
SOURCES=Log.cpp \
????????????? LogDll.rc\
?????????????
TARGET_DESTINATION=Target\chk
PASS1_BINPLACE=$(OBJ_PATH)\$(O)\$(TARGETNAME).lib
PASS2_BINPLACE=$(OBJ_PATH)\$(O)\$(TARGETNAME).dll
和CommonLib類似,只是target類型不一樣。
?
?
VC源代碼移植一些常見編譯錯誤
?
?
?
一些遺留移植以及完善工作
1.??????除AVModule的各業務模塊都沒有進行移植編譯,需要各個模塊的負責人進行移植
2.??????在移植過程中的一些錯誤改正,以及OACR檢測出的一些警告的修復等。
3.??????Build client環境的一些自動化設置腳本,已經一些通用的腳本編寫,命令擴展工作等。
4.??????待補充…
總結
以上是生活随笔為你收集整理的客户端DDK编译环境配置说明的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【系统分析师之路】2011年系统分析师上
- 下一篇: 云计算和大数据书籍