2016-12-09 100 views
0

我們有一個Visual Studio 2015驅動程序項目。出於各種原因,我們使用「make」(爲Windows構建的unix工具)來構建我們的整個產品。最好還是使用make構建僅用於窗口的組件(保持構建過程一致)。無法複製Visual Studio Build

運行Server 2012R2,VS 2015年更新3,10 DDK和SDK 10

該項目建立在罰款和VS2015司機的作品,所以,代碼庫是好的。

我啓用了詳細的構建輸出,並捕獲了分析VS正在做什麼來構建項目(驅動程序只是一堆C文件,似乎沒有太驚人的獨特性)。 VS構建設置LIB,LIBPATH和INCLUDE變量,然後發出一個「cl.exe」命令來構建,然後通過「link.exe」命令進行鏈接。還有建立消息文件(mc.exe)和資源文件「rc.exe」的命令。我捕獲了所有這些命令並將它們合併到makefile中。

我可以讓項目編譯,但是,我的問題是與鏈接階段。我會在幾行中顯示錯誤。我試圖在「VS2015 x64本機工具命令提示符」(%comspec% /k ""C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat"" amd64)中自行運行命令(來自日誌),我也遇到了同樣的錯誤。

當我聯繫,我得到:

LINK : error LNK2001: unresolved external symbol GsDriverEntry 
os_win.obj : error LNK2001: unresolved external symbol __stdio_common_vsprintf 
winbuild\x64\Win7Release\driver.sys : fatal error LNK1120: 2 unresolved externals 

我不得不作出從VS記錄中的cl.exe命令行,這是指定/ GS-一個變化(VS啓用該選項)。否則,當我運行的編譯和鏈接命令對應的,我得到了一堆額外的錯誤:

os_win.obj : error LNK2001: unresolved external symbol __security_cookie 

所以,谷歌搜索的vsprintf中的錯誤,我碰到建議帶着legacy_stdio_definitions.lib鏈接訪問這些功能,但沒有工作(使用Cygwin的nm.exe檢查的lib,結果表明,vsprintf函數是ü ndefined。

如果我從編譯文件,我失去了約GsDriverEntry是不確定的錯誤,但我仍然有vsprintf中的錯誤。

我試過還刪除了/ no defaultlib鏈接選項...沒有效果。

因此,我對於發生了什麼事情感到完全喪失。對我來說沒有意義,VS可以構建項目,但我不能,使用相同的命令。我錯過了什麼細節或概念?

我的鏈接命令行:

link /OUT:Win7Release/driver.sys \ 
/NOLOGO /INCREMENTAL:NO /IGNOREIDL /OPT:ICF /MAP /SUBSYSTEM:CONSOLE /OPT:REF \ 
/PDB:none /MACHINE:X64 /MANIFEST:NO /WX /PROFILE /kernel /Driver /RELEASE \ 
/VERSION:"10.0" /osversion:10.0 /ENTRY:"GsDriverEntry" \ 
/IGNORE:4198,4010,4037,4039,4065,4070,4078,4087,4089,4221,4108,4088,4218,4218,4235 \ 
/ERRORREPORT:PROMPT /MERGE:"_TEXT=.text;_PAGE=PAGE" /SECTION:"INIT,d" \ 
/IMPLIB:"Win7Release/driver.lib" /SUBSYSTEM:NATIVE",6.01" \ 
.. list of obj files .. \ 
kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib \ 
shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib \ 
legacy_stdio_definitions.lib ntoskrnl.lib hal.lib wmilib.lib BufferOverflowK.lib 

回答

0

好了,好了,我發現this post,今年早些時候這讓我有其他類似的問題...似乎vsprintf中也被聲明爲內聯,現在。將_NO_CRT_STDIO_INLINE設置爲cl.exe的/ D選項允許代碼構建AND鏈接。

那麼..爲什麼Visual Studio 2015項目會正確構建?該定義不在構建輸出中。

+0

回答你自己的問題很好,但如果你想要另一個問題的答案,它需要另一個問題。 –

+0

當您從_VS_ build獲取命令時,您是否還捕獲了工具運行時出現的shell環境字符串? 'cl.exe'和'link.exe'對其中的一些很敏感。 – bobbogo

相關問題