使用/安装了VS2010 Platform SDK (Microsoft Windows SDK v7.1)进行构建。
当我尝试构建示例LSP时(位于C:\Program Files\Microsoft Platform SDK\Samples\NetDS\WinSock\LSP)
!--BEGIN RESOLVED-!
我得到了下面相同的两个错误中的16个。
Error 1 error C1083: Cannot open include file: 'nt.h': No such file or directory c:\program files\microsoft sdks\windows\v7.1\samples\netds\winsock\lsp\nonifslsp\lspdef.h 22 1 LSP
Error 7 error C1083: Cannot open include file: 'lspcommon.h': No such file or directory c:\program files\microsoft sdks\windows\v7.1\samples\netds\winsock\lsp\install\instlsp.h 35 1 LSP当我将此示例的源代码添加到VS时,我使用了File>New ProjectFrom现有代码。一旦我这样做了,VS就开始导入所有的Platform SDK包含文件。我在其他地方读到,没有来自PSDK的includes会导致问题,但这里似乎不是这样。
!--END RESOLVED--!
在修复了上面的问题之后,我现在又遇到了3个错误:
Error 1 error LNK2005: "struct _GUID gProviderGuid" (?gProviderGuid@@3U_GUID@@A) already defined in lspguid.obj C:\Program Files\Microsoft SDKs\Windows\v7.1\Samples\netds\winsock\lsp\instlsp.obj LSP
Error 6 error CVT1100: duplicate resource. type:MANIFEST, name:1, language:0x0409 C:\Program Files\Microsoft SDKs\Windows\v7.1\Samples\netds\winsock\lsp\CVTRES LSP
Error 7 error LNK1123: failure during conversion to COFF: file invalid or corrupt C:\Program Files\Microsoft SDKs\Windows\v7.1\Samples\netds\winsock\lsp\LINK LSP我没有更改LSP示例中的任何内容/文件。
目前我只是在尝试构建它。
任何关于这方面的见解都会有所帮助。
谢谢。
发布于 2011-03-29 09:39:52
文件lspcommon.h是LSP示例的一部分,您应该能够在“common”子文件夹中找到它。(C:\Program Files\Microsoft SDKs\Windows\v7.1\Samples\netds\winsock\lsp\common)
如果你双击你的一个错误,编辑器将会打开,专注于给出问题的那一行。对lspdef.h第22行执行此操作,您将看到代码如下所示……
#ifndef _PSDK_BLD
#include <nt.h>
#include <ntrtl.h>
#include <nturtl.h>
#endif这意味着,只有在未定义宏_PSDK_BLD的情况下,才包含nt.h文件(和其他两个文件)。再往下看一下35行,你会看到代码看起来像这样……
#ifndef _PSDK_BLD
#include <lspcommon.h>
#else
#include "..\common\lspcommon.h"
#endif在这种情况下,如果未定义宏,则代码包括文件lspcommon.h,但如果定义了宏,则代码包括公共文件中的文件lspcommon.h。
那么,您的问题很可能是因为没有定义_PSDK_BLD而发生的。从#ifdef的样式来看,宏看起来不需要定义为任何特定的值,只需定义即可。
在Visual Studio中,转到“项目属性”,向下钻取到C/C++,然后选择“预处理器”。然后找到预处理器定义行并单击值。现在选择edit并将_PSDK_BLD添加到预处理器定义列表中。
注意前导下划线,并记住对Debug和Release配置(以及您可能已经定义的所有平台)进行更改。
错误LNK2005意味着链接器找到了它试图链接的对象的两个定义-这是一个问题,因为链接器无法知道它应该使用这两个定义中的哪一个。
在这种情况下,链接器尝试解析的对象是"struct _GUID gProviderGuid“。如果您查看文件instlsp.h、lspdef.h (这两个文件)和lspcommon.h,您将看到如下代码
extern GUID gProviderGuid;它声明了一个名为gProviderGuid的外部变量,类型为GUID (这是一个结构)。链接器必须在包含这些头文件之一的任何文件中解析该外部引用,然后对gProviderGuid进行引用。
从错误的“已在lspguid.obj中定义”部分,我们知道链接器已经查看了文件lspguid.obj内部,并找到了gProviderGuid的定义。果然,如果我们查看lspguid.cpp内部,我们可以看到gProviderGuid的定义,值从0xc5fabbd0开始。
从相同错误的"C:\Program Files\Microsoft SDKs\Windows\v7.1\Samples\netds\winsock\lsp\instlsp.obj“部分”中,我们知道链接器还查看了文件instlsp.obj内部,并找到了gProviderGuid的另一个定义。如果我们查看intlsp.cpp内部,我们可以看到gProviderGuid的另一个定义(这次没有任何值)。
因此,问题是链接器同时在lspguid.obj和intlsp.obj中查找,并发现gProviderGuid的定义冲突。
这两个文件不应该是同一构建的一部分,所以我们不应该期望链接器的一次运行能够同时读取这两个文件。
LSP项目由四部分组成: lspcommon,用于生成静态库lspcommon.lib;ifslsp,用于生成文件ifslsp.dll;nonifslsp,用于生成文件nonifslsp.dll和install,用于生成文件Instlsp.exe。有关详细信息,请参阅lsp中的readme.txt文件和各个文件夹中的makefile文件。
如果您要在Visual Studio中构建LSP,那么在您的解决方案中确实需要四个不同的项目,分别用于lspcommon、ifslsp、nonifslsp和install。
发布于 2011-03-29 09:13:32
将这个定义添加到您的构建中:_PSDK_BLD它将解决您的问题
发布于 2011-03-29 09:12:42
尝试将#include <nt.h>更改为#include <winnt.h>,看看它是否会构建。
https://stackoverflow.com/questions/5466358
复制相似问题