1

安装/使用 VS2010 Platform SDK (Microsoft Windows SDK v7.1) 构建。

当我尝试构建示例 LSP(位于 C:\Program Files\Microsoft Platform SDK\Samples\NetDS\WinSock\LSP 中)

!--开始解决--!

我在下面得到了 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 Existing Code。一旦我这样做了,VS 就会开始导入所有 Platform SDK 包含文件。我在别处读到,没有 PSDK 的包含会导致问题,但这里似乎并非如此。

!--结束解决--!

修复上述问题后,我现在又遇到了 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 示例中的任何内容/文件。

目前我只是在尝试构建它。

对此的任何见解都会有所帮助。

谢谢。

4

3 回答 3

2

文件 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,但如果定义了宏,则代码包含来自 common foider 的文件 lspcommon.h。

那么您的问题似乎很可能正在发生,因为 _PSDK_BLD 未定义。从#ifdef 的风格来看,宏不需要定义为任何特定值,只需定义即可。

在 Visual Studio 中,转到项目属性,深入到 C/C++,然后是预处理器。然后找到预处理器定义行并单击该值。现在选择编辑并将 _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 和安装。

于 2011-03-29T01:39:52.377 回答
1

将此定义添加到您的构建中:_PSDK_BLD 它会解决您的问题

于 2011-03-29T01:13:31.550 回答
0

尝试更改#include <nt.h>#include <winnt.h>,看看它是否建立。

于 2011-03-29T01:12:42.400 回答