2011-03-28 116 views
1

使用VS2010编译 安装了平台SDK(Microsoft Windows SDK v7.1)。构建Microsoft的LSP示例代码

当我尝试建立样本LSP(位于C:\ Program Files文件\ Microsoft平台SDK \的Samples \ NetDS \的WinSock \ LSP)

- 开始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,我使用文件>新建ProjectFrom现有的代码。 一旦我这样做,VS开始导入所有Platform SDK包含文件。我在其他地方读到,没有PSDK的包含会导致问题,但这似乎并非如此。

! - END RESOLVED--!

我现在固定了上述问题后碰上3个错误:

Error 1 error LNK2005: "struct _GUID gProviderGuid" ([email protected]@[email protected]@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样品中更改的任何内容/文件。

目前我只是试图建立它。

任何有关这方面的见解将有所帮助。

谢谢。

+0

你好吗?从命令行,IDE等... – JaredPar 2011-03-28 23:54:13

+0

使用IDE,谢谢。 – Dacto 2011-03-29 00:09:14

+0

我把它的文件不退出 - 搜索发现了几个来源,但我一定会小心选择任何,如果感兴趣,这里是一个链接:http://www.komodia.com/lsp/lsp-sample/ – 2011-03-29 00:17:45

回答

0

尝试更改#include <nt.h>#include <winnt.h>并查看它是否构建。

1

添加这个定义到您的构建:_PSDK_BLD 这将解决您的问题

2

文件lspcommon.h是LSP样品的一部分,你应该能够找到它在“普通”子文件夹。 (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文件(2人)只包括如果宏_PSDK_BLD不定义。瞧低了一些,在第35行,你会看到的代码看起来像这样...

#ifndef _PSDK_BLD 
#include <lspcommon.h> 
#else 
#include "..\common\lspcommon.h" 
#endif 

在这种情况下,如果不定义宏的代码包括文件lspcommon.h,但如果宏定义的那么代码包含了来自普通文件的文件lspcommon.h。

由于_PSDK_BLD没有定义,因此您的问题似乎可能发生。从#ifdef的风格看,它看起来并不像宏必须被定义为任何特定的值,只是定义。

在Visual Studio中,转到项目属性,深入到C/C++,然后预处理器。然后找到预处理器定义行并单击该值。现在选择编辑并将_PSDK_BLD添加到预处理器定义列表中。

注意那些领先的下划线,并且记住要用于调试的变更和发布配置(和所有的平台上,您可以定义)


错误LNK2005意味着链接找到两个定义对于它试图链接的对象 - 这是一个问题,因为链接器无法分辨应该使用哪个定义。

在这种特殊情况下,连接器正试图解决的对象是“结构_GUID gProviderGuid”。如果您在文件instlsp.h,lspdef.h(双方)的外观和lspcommon.h你会看到代码,看起来像这样

extern GUID     gProviderGuid; 

声明称为类型GUID的gProviderGuid(外部变量,是一个结构体)。链接器必须在包含其中一个头文件的任何文件中解析外部引用,然后对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并安装用于生成文件Instlsp.exe。有关更多详细信息,请参阅lsp中的readme.txt文件和各种文件夹中的生成文件文件。

如果你要建立LSP在Visual Studio中,你真的需要在您的解决方案四个不同的项目,分别为lspcommon,ifslsp,nonifslsp和安装。

+0

我跟着你的意见和它的工作对解决这个问题,现在我遇到了另外3个错误(加入主要问题后)。 – Dacto 2011-03-29 02:56:16

+0

这只是一个猜测,但是:当你使用“文件>新建ProjectFrom现有代码”做你做了一个大的LSP项目,或者你做了单独的项目来生成Instlsp.exe,ifslsp.dll和nonifslsp.dll? – 2011-03-29 17:58:33

+0

假设我做了一个大项目,你是完全正确的。现在进行测试。 – Dacto 2011-03-31 00:54:55