2015-02-24 17 views
1

用於診斷現有構建(二進制文件,exe的,DLL的,庫的集合)的目的。如何檢查從VC++生成的二進制EXE的運行時庫類型

有沒有一種方法,使用SDK或其他實用程序的命令行工具來快速檢查運行庫類型是否編譯了一個對象文件?

例如,假設.dll顯然是針對Dynamic運行時編譯的(但如果它是Debug或Release版本,它仍不明顯)。

雖然在.exe的情況下更困難(確定是否使用動態/靜態和調試/釋放)。

(我的意思是,無需打開VC++項目文件或查看nmake/msbuild文件中使用的編譯器選項)。

回答

2

dumpbin /dependents將允許您確定模塊(EXE或DLL)是否依賴於Visual C++庫DLL(以及這些DLL的哪些版本和風格 - 調試或發佈)。例如,使用Visual C++ 2013 ...

當你/MD編譯,你的模塊依賴於零售msvcr120.dll:

>cl /MD /nologo test.cpp 
test.cpp 

>dumpbin /dependents test.exe | findstr dll 
    MSVCR120.dll 
    KERNEL32.dll 

當你/MDd編譯,你的模塊取決於調試msvcr120d .dll文件:

>cl /MDd /nologo test.cpp 
test.cpp 

>dumpbin /dependents test.exe | findstr dll 
    MSVCR120D.dll 
    KERNEL32.dll 

當你與/MT/MTd編譯,你的模塊不依賴於任何CRT DLL:

>cl /MT /nologo test.cpp 
test.cpp 

>dumpbin /dependents test.exe | findstr dll 
    KERNEL32.dll 

>cl /MTd /nologo test.cpp 
test.cpp 

>dumpbin /dependents test.exe | findstr dll 
    KERNEL32.dll 

當您靜態鏈接Visual C++庫時,通常無法確定零售庫或調試庫是否已鏈接(通常,您無法確定是否鏈接了任何Visual C++庫)。如果您的模塊具有PDB,那麼您通常可以根據模塊中存在的源文件信息和函數來確定鏈接的內容。 (2條記錄:[1]我的test.cpp文件是一個簡單的C Hello,World!程序,如果它動態地鏈接了其他的Visual C++庫,dumpbin /dependents也會報告它們。[2] dumpbin /dependents與DLLs )

+0

'dumpbin'和'link'不能通過Visual Studio分發(https://www.visualstudio.com/en-us/productinfo/2015-redistribution-vs),所以它的實用程序僅限於開發者的結局;我如何通過C或C++獲得類似的查詢?我很好地使用操作系統庫來做到這一點,但我需要這種工具,我可以使用一些消費模塊進行分發。 – 2017-04-27 20:40:29

相關問題