我们有一个Visual Studio 2015驱动程序项目。由于各种原因,我们使用“make”(为windows构建的unix工具)来构建我们的整个产品。还优选使用make来构建仅限windows的组件(使构建过程保持一致)。
运行Server 2012R2,VS 2015 Update 3,DDK 10和SDK 10.
该项目在VS2015中构建良好且驱动程序正常工作,因此代码库很好。
我启用了详细的构建输出并捕获了它以分析VS正在做什么来构建项目(驱动程序只是一堆C文件,似乎没有任何太惊天动地的独特)。 VS构建设置LIB,LIBPATH和INCLUDE变量,然后发出“cl.exe”命令进行构建,然后发出“link.exe”命令进行链接。还有用于构建消息文件(mc.exe)和资源文件“rc.exe”的命令。我捕获了所有这些命令并将它们合并到一个makefile中。
我可以让项目编译但是,我的问题在于链接阶段。我将在几行中显示错误。我试过在“VS2015 x64 Native Tools命令提示符”(%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。
如果我是从makefile构建的,我会丢失关于GsDriverEntry未定义的错误,但我仍然有vsprintf错误。
我还尝试删除/ nodefaultlib链接选项......没有效果。
所以,我完全不知道发生了什么。对我来说没有意义,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 :(得分:0)
好吧,好吧,我找到this post,这在今年早些时候帮助了我另一个类似的问题......似乎vsprintf现在也被内联声明了。将_NO_CRT_STDIO_INLINE
设置为cl.exe的/ D选项允许代码构建AND链接。
那么..为什么Visual Studio 2015项目会正确构建?该定义不在构建输出中。