【问题标题】:Building Microsoft's LSP sample code构建微软的 LSP 示例代码
【发布时间】:2011-03-28 23:50:28
【问题描述】:

使用/使用 VS2010 构建 已安装平台 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 的包含会导致问题,但这里似乎不是这种情况。

!--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 示例中的任何内容/文件。

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

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

谢谢。

【问题讨论】:

  • 你建设得怎么样了?从命令行、IDE 等...
  • 我认为文件不会退出 - 搜索找到了一些来源,虽然我肯定会注意选择任何来源,如果有兴趣,这里有一个链接:komodia.com/lsp/lsp-sample
  • lspcommon.h 存在。我不知道 nt.h 是关于什么的。

标签: c++ visual-studio winsock-lsp


【解决方案1】:

文件 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

这意味着,nt.h 文件(和其他两个文件)仅在未定义宏 _PSDK_BLD 时才包含。再往下看第 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添加到预处理器定义列表中。

注意前面的下划线,并记住要更改调试和发布配置(以及您可能定义的所有平台)


错误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。

【讨论】:

  • 我听从了你的建议,它解决了这个问题,现在我又遇到了 3 个错误(添加到主要问题帖子中。)
  • 这只是一个猜测,但是:当您使用“File>New ProjectFrom Existing Code”时,您是制作了一个大型 LSP 项目还是制作了单独的项目来生成 Instlsp.exe、ifslsp.dll 和 nonifslsp .dll?
  • 你假设我做了一个大项目是完全正确的。现在进行测试。
  • 我对如何将多个“现有代码中的项目”添加到单个解决方案感到困惑。
  • 可能最简单的做法是制作四个不同的“从现有代码项目”项目/解决方案,然后将它们捆绑在一起。首先在每个 ifslsp、nonifslsp、install 和 common 文件夹中分别执行“Project from existing code”。 ifslsp 和 nonifslsp 项目应该是 DLL,install 应该是 exe,common 应该是静态库 (lib)。创建完公共项目后,右键单击该项目(在解决方案资源管理器中)并将其重命名为 lspcommon,以便生成一个名为 lspcommon.lib 的文件。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    尝试将 #include &lt;nt.h&gt; 更改为 #include &lt;winnt.h&gt; 并查看它是否构建。

    【讨论】:

      猜你喜欢
      • 2011-05-03
      • 2015-09-18
      • 2018-12-04
      • 1970-01-01
      • 1970-01-01
      • 2017-04-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多