1

Visual Studio 2008でコンパイルする基本的なATLプロジェクトの取得に取り組んでいますが、エラーが発生し続けます。最終的に、次のビルドエラーでスタックしました。

1>Linking...
1>   Creating library Debug\SomeProject.lib and object Debug\SomeProject.exp
1>dllmain.obj : error LNK2001: unresolved external symbol _LIBID_SomeProjectLib
1>SomeObject.obj : error LNK2001: unresolved external symbol _LIBID_SomeProjectLib
1>SomeObject.obj : error LNK2001: unresolved external symbol _IID_ISomeObject
1>Debug\SomeProject.dll : fatal error LNK1120: 2 unresolved externals

私は何を見落としているか、間違っているのですか?再現する手順は次のとおりです。

  1. 新しいATL Project名前を作成しますSomeProject。すべてのデフォルトを受け入れます。
  2. ソリューションエクスプローラーでプロジェクトを右クリックし、を選択しますAdd > Class
  3. 短縮名として選択ATL Simple Objectして入力します。SomeObject他のすべてのデフォルトを受け入れます。

この時点で、プロジェクトは正常に構築されます。ただし、整理しやすくするためにIDLを複数のファイルに分割したいと思います(IDLは数千行の長さになります)。

  1. プロジェクトを右クリックして、を選択しますAdd > New Item
  2. ファイル名として選択Midl Fileして入力します。ISomeObject
  3. インターフェイス宣言を開いSomeProject.idlて切り取ります。ISomeObjectに置き換えますimport "ISomeObject.idl";
  4. インターフェイス宣言をに貼り付けますISomeObject.idl

MicrosoftのIDLコンパイラを満たすには、いくつかのオプションを変更する必要があります。

  1. プロジェクトを右クリックして、そのプロパティを開きます。セクションに移動してMIDL > Output、次の値を入力します。
    • ヘッダーファイル:$(InputName).h
    • IIDファイル:$(InputName)_i.cpp
    • プロキシファイル:$(InputName)_p.cpp
    • タイプライブラリの生成:No
  2. セクションに移動し、C/C++ > Precompiled Headersに設定Create/Use Precompiled HeaderNot using Precompiled Headerます。プリコンパイル済みヘッダーを使用すると、後でエラーが発生します。
  3. SomeProject.idlプロパティが表示されるようにファイルを選択します。セクションに移動し、MIDL > Outputに設定Generate Type LibraryYesます。
  4. フィルターSomeProject_i.hから取り外しSomeProject_i.cます。Generated Files
  5. 次の既存のアイテムをGenerated Filesフィルターに追加します。最初にプロジェクトのコンパイルを試みる必要があるかもしれません。
    • SomeProject.h
    • SomeProject_i.cpp
    • ISomeObject.h
    • ISomeObject_i.cpp

さて、この時点で私はプロジェクトがコンパイルされることを期待します。しかし、そうではありません。LNK1120この質問の上部にリストしたエラーが表示されるはずです。

何か案は?シンプルなものを見落としていますか?

4

2 に答える 2

1

何をしているのか、なぜこれをしているのかわからないが、途中でmidl.exeが生成するblah_i.cソースコードファイルを失った。これには、リンカが文句を言っているインターフェイス、剰余類、および型ライブラリのGUIDが含まれています。見つからない場合は、*。cファイルでMIDL_DEFINE_GUIDを検索してください。

編集:問題が発生しました。blah_i.cの名前をblah_i.cppに変更しました。それは間違っています、ファイルにはC宣言が含まれています。コンパイラーは、C ++コードとしてコンパイルされるときに、識別子を異なる方法でマングルします。名前を.cに戻します。または、/Tcコンパイルオプションを使用します。

于 2010-07-27T18:54:50.413 に答える
1

VS 2008コマンドプロンプトを開き、中間/出力ディレクトリに移動して、someproject_i.objを確認します。次のようなものを試してください。

dumpbin someproject_i.obj /symbols | find "LIBID"

オブジェクトファイルにlibidが定義されていない場合は、それが問題です。どういうわけか間違った名前を持っているのでしょうか?正しい名前のものがある場合、問題はリンカーがそれを使用していないことです。

于 2010-07-27T18:52:49.293 に答える