0

テスト中のプロジェクトのすべての関数呼び出しに対してLNK2019エラーをスローしているネイティブ C++ 単体テスト プロジェクトがあります。驚くべきことに、IntelliSense は問題なく動作します。

テスト対象のプロジェクトは、単一の public static 関数で構成される静的ライブラリ (.lib) です (型とメンバーの名前は無実を保護するために変更されています)。

Type.h

#pragma once

#include <string>

using namespace std;

namespace N
{
    enum class ResultCode { Undefined, A, B, C}; 

    class MyType
    {
    public:
        static void GetResult(string id, string metadata, ResultCode result);
    };
}

Type.cpp

#include "pch.h"
#include "Type.h"

namespace N
{
    void MyType::GetResult(string id, string metadata, N::ResultCode result)
    {
        // implementation
    }
}

私の単体テスト プロジェクト (.dll) は、テスト用のヘッダー ファイルを使用しません。私はGoogleテストフレームワークを使用しています。ソースは次のとおりです。

テスト.cpp

#include <pch.h>
#include <gtest/gtest.h>
#include <gtesthelpers/gtesthelpers.h>
#include <MyType.h>

class MyTypeUnitTests : public testing::Test {};

TEST(MyTypeUnitTests, Foo)
{
    std::string metadata; 
    N::ResultCode result = N::ResultCode::Undefined;
    N::MyType::GetResult("1234", metadata, result);
    ASSERT_TRUE(result == N::ResultCode::A);
}

MyType をコンパイルすると、すべて問題ありません。Test を書いたとき、IntelliSense は GetResult の署名を提供してくれました。しかし、コンパイルすると:

Test.obj : エラー LNK2019: 未解決の外部シンボル "public: static void __cdecl N:MyType:GetResult(class std::basic_string,class std::allocator >,class std::basic_string,class std::allocator >, enum N ::ResultCode)" ... 関数内で参照 ...

テスト プロジェクトのプロパティを次のように変更しました。

  • [VC++ ディレクトリ] > [ディレクトリを含める] には、MyType.h を含むディレクトリへの参照が含まれています。
  • VC++ ディレクトリ > 参照 ディレクトリには、MyType.lib を含むディレクトリへの参照が含まれています。

また、テスト プロジェクトの Project Dependencies で、テスト中のプロジェクトがチェックされていることを確認しました。また、undname を使用して、エラーで指定された関数名が .h および .cpp の名前と一致することを確認しました。

最後に、MyType で新しい静的パラメーターなし関数を作成し、テストからそれを呼び出してみました (enum パラメーターの問題を除外するため) が、ダイスはありませんでした。上記でリンクした MSDN ページの指示に従いましたが、アイデアがありません。

これを解決するにはどうすればよいですか?

編集: cpp で名前空間ブロックを表示します。

4

2 に答える 2

0

Configuration Properties > Linker > Input > Additional Dependenciesのテスト プロジェクト プロパティにライブラリへの参照を追加することで、これを解決しました。パスはなく、「Type.lib」だけです。

于 2013-08-14T19:36:39.273 に答える