この問題は VS2010 に固有のものです。MCVEを与える単純なケースでは再現できませんでした(以下を参照)。
いくつかの古いレガシー プロジェクトがあります。(とりわけ) 3 つの C++ プロジェクトがあります。
GoogleTestingFramework -との
.lib
機能を提供するプロジェクト 。使いやすさのために作成されました。GTest
GMock
OldLegacyProject - 古い
.exe
プロジェクト。- ここで対象となるエンティティは
Class1
とClass2
です。どちらも別々のファイルにClass1.cpp
+Class1.hpp
(Class2 も同じ) あります。
- ここで対象となるエンティティは
OldLegacyProjectUnitTests -およびを使用して記述された単体テストを含む新しい
.exe
プロジェクト。GTest
GMock
- このプロジェクトは、プロジェクト参照を参照
GoogleTestingFramework
およびOldLegacyProject
使用しています。 - 参照プロパティでは、Visual Studio 2010 のルールに従って、
依存関係にあるプロジェクトから静的ライブラリを自動リンクしないようにしています。特に、この部分は次のようになります。
- に変更しようとしまし
Use Library Dependency Inputs
たtrue
が、問題に関しては何も変わりませんでした
- に変更しようとしまし
- このプロジェクトのクラスは
Class1
and を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
と、すべてが正しくコンパイルおよびリンクされます。しかし、これは非常に複雑な方法であり、この比較的単純な方法を扱う人に教えたいと思います。
どんな助けにも感謝します。