日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

客户端DDK编译环境配置说明

發布時間:2023/12/14 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 客户端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
pass 1

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编译环境配置说明的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。