1

VS2010 Platform SDK (Microsoft Windows SDK v7.1) をインストールしてビルド/使用。

サンプル LSP をビルドしようとすると (C:\Program Files\Microsoft Platform SDK\Samples\NetDS\WinSock\LSP にあります)

!--解決開始--!

以下の同じ 2 つのエラーのうち 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)

エラーの 1 つをダブルクリックすると、エディタが開き、問題のある行に焦点が当てられます。lspdef.h の 22 行目でこれを行うと、コードは次のようになります...

#ifndef _PSDK_BLD
#include <nt.h>
#include <ntrtl.h>
#include <nturtl.h>
#endif

つまり、マクロ _PSDK_BLD が定義されていない場合にのみ、nt.h ファイル (および他の 2 つのファイル) が含まれます。少し下の 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は、リンカーがリンクしようとしているオブジェクトに対して 2 つの定義を見つけたことを意味します。これは、リンカーが 2 つの定義のどちらを使用すべきかを判断する方法がないため、問題です。

この特定のケースでは、リンカーが解決しようとしているオブジェクトは "struct _GUID gProviderGuid" です。ファイル instlsp.h、lspdef.h (両方)、および lspcommon.h を見ると、次のようなコードが表示されます。

extern GUID                 gProviderGuid;

これは、タイプ GUID (構造体) の gProviderGuid という外部変数を宣言します。リンカーは、これらのヘッダー ファイルの 1 つを含むすべてのファイルでその外部参照を解決し、gProviderGuid への参照を作成する必要があります。

エラーの "already defined in lspguid.obj" の部分から、リンカがファイル lspguid.obj を調べて gProviderGuid の定義を見つけたことがわかります。案の定、lspguid.cpp の中を見ると、値が 0xc5fabbd0 で始まる gProviderGuid の定義を確認できます。

同じエラーの「C:\Program Files\Microsoft SDKs\Windows\v7.1\Samples\netds\winsock\lsp\instlsp.obj」の部分から、リンカーがファイル instlsp.obj の内部も調べており、 gProviderGuid の 2 番目の定義が見つかりました。intlsp.cpp の中を見ると、gProviderGuid の別の定義を確認できます (今回は値がありません)。

問題は、リンカが lspguid.obj と intlsp.obj の両方を調べて、競合する gProviderGuid の定義を見つけていることです。

これらの 2 つのファイルは同じビルドの一部であってはならないため、リンカーを 1 回実行しただけで両方が同時に読み取られるとは考えるべきではありません。

LSP プロジェクトは 4 つの部分で構成されています。静的ライブラリ lspcommon.lib を生成するために使用される lspcommon。ファイル ifslsp.dll の生成に使用される ifslsp。nonifslsp.dll ファイルの生成に使用される nonifslsp と、ファイル Instlsp.exe の生成に使用される install です。詳細については、lsp の readme.txt ファイルとさまざまなフォルダーの makefile ファイルを参照してください。

Visual Studio 内で LSP をビルドする場合、ソリューションには 4 つの異なるプロジェクトが必要です。それぞれ、lspcommon、ifslsp、nonifslsp、および install 用です。

于 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 に答える