0

この問題は VS2010 に固有のものです。MCVEを与える単純なケースでは再現できませんでした(以下を参照)。

いくつかの古いレガシー プロジェクトがあります。(とりわけ) 3 つの C++ プロジェクトがあります。

  1. GoogleTestingFramework -との.lib機能を提供するプロジェクト 。使いやすさのために作成されました。GTestGMock

  2. OldLegacyProject - 古い.exeプロジェクト。

    • ここで対象となるエンティティはClass1Class2です。どちらも別々のファイルにClass1.cpp+ Class1.hpp(Class2 も同じ) あります。
  3. OldLegacyProjectUnitTests -およびを使用して記述された単体テストを含む新しい.exeプロジェクト。GTestGMock

    • このプロジェクトは、プロジェクト参照を参照GoogleTestingFrameworkおよびOldLegacyProject使用しています。
    • 参照プロパティでは、Visual Studio 2010 のルールに従って、 依存関係にあるプロジェクトから静的ライブラリを自動リンクしないようにしています。特に、この部分は次のようになります。
      ここに画像の説明を入力
      • に変更しようとしましUse Library Dependency Inputstrueが、問題に関しては何も変わりませんでした
    • このプロジェクトのクラスはClass1and をClass2直接使用し (それらは単体テストであるため)、それら.objのとリンクする必要があります

すべてをビルドしようとすると、次の liker エラーが発生します。

3>OldLegacyProjectUnitTests.obj : error LNK2019: unresolved external symbol "public: __thiscall Class1::Class1(class Class2 &)" (??0Class1@@QAE@AAVClass2@@@Z) referenced in function "private: virtual void __thiscall SimpleCase_Should_CreateNewInstance_When_Called_Test::TestBody(void)" (?TestBody@SimpleCase_Should_CreateNewInstance_When_Called_Test@@EAEXXZ)
3>OldLegacyProjectUnitTests.obj : error LNK2019: unresolved external symbol "public: __thiscall Class2::Class2(void)" (??0Class2@@QAE@XZ) referenced in function "private: virtual void __thiscall SimpleCase_Should_CreateNewInstance_When_Called_Test::TestBody(void)" (?TestBody@SimpleCase_Should_CreateNewInstance_When_Called_Test@@EAEXXZ)

3>../Debug/OldLegacyProjectUnitTests.exe : fatal error LNK1120: 2 unresolved externals

ガイドを使用して簡単な例を作成しました: Google Test #1.b:上記と同じ構成で、Visual Studio で Googletest をセットアップすると、正しく動作します。

質問は次のとおりです。

  • プロジェクト参照にもかかわらず、リンカがこれらのクラスを認識しないのはなぜですか?
    • リンカーが実際に「見ている」ものを確認する方法は? (少なくとも、どのファイル)
  • その結果:クラスをリンカに供給する方法は?

それらへのパスを明示的に追加する.objと、すべてが正しくコンパイルおよびリンクされます。しかし、これは非常に複雑な方法であり、この比較的単純な方法を扱う人に教えたいと思います。

どんな助けにも感謝します。

4

0 に答える 0