0

リンカーから次のエラーが表示されます。

1>PACBalancesTest.obj : error LNK2001: unresolved external symbol "public: bool __thiscall PAC::BalChgKeyComparator::operator()(class PAC::BalChgKey const &,class PAC::BalChgKey const &)const " (??RBalChgKeyComparator@PAC@@QBE_NABVBalChgKey@1@0@Z)

「欠落している」シンボルの定義を繰り返し見てきたが、何の問題も見当たらなかったので、本当に明らかな何かが欠落しているに違いない。

シンボルの定義は .lib ファイルにあります。その .lib ファイルの dumpbin /symbols からの出力には、次のように表示されます。

2F0 00000000 SECTFD notype ()    External     | ??RBalChgKeyComparator@PAC@@QBE_NABVBalChgKey@1@0@Z (public: bool __thiscall PAC::BalChgKeyComparator::operator()(class PAC::BalChgKey const &,class PAC::BalChgKey const &)const )

そして、その .lib ファイルから正常に解決されている他のシンボルがあります! (実際には、同じ .obj からです。) [更新: 前のステートメントはもはや真実ではないと思います。これは、.h ファイルで定義されていない関数にアクセスする最初の試みかもしれません。]

以下の内容は問題とは関係ありません -- ですから、時間をかけて勉強しないでください!

関数の宣言は次のとおりです (PACBalances.h 内)。

namespace PAC {
    class BalChgKey {
    public:
        ...
    };

    struct BalChgKeyComparator {
        bool operator()(const BalChgKey& lhs, const BalChgKey& rhs) const;
    };

    typedef std::multimap<BalChgKey, long, BalChgKeyComparator> BalChgKeyLongMMap;
};

上記の「構造体」を「クラス」に変更しようとしたが、効果がないことに注意してください。

呼び出しコードは次のとおりです (cpputest テスト ファイル内)。

#include "CppUTest/TestHarness.h"

#include <utility>
#include <map>
#include "PACBalances.h"

using namespace PAC;

...

TEST_GROUP(PACBalanceCUMap)
{
    BalChgKeyLongMMap empty;
    BalChgKeyLongMMap onesy;

    void setup()
    {
        // **Adding the following line caused this error to start to occur.**
        onesy.insert(std::pair<BalChgKey, long>(BalChgKey(BOPCAT_FEE, PAYMTYPE_OVERDRAFT_FEE, 4321, 41100, 1, 17), 17));
    }
    void breakdown()
    {
    }
};

そして、演算子関数自体の定義は次のとおりです。

bool PAC::BalChgKeyComparator::operator()(
    const BalChgKey& thing1, 
    const BalChgKey& thing2
    ) const
{
    if (thing1.m_balKey.m_balCat < thing2.m_balKey.m_balCat)        return true;
    else if (thing1.m_balKey.m_balCat > thing2.m_balKey.m_balCat)   return false;
    // Fall thru if balCats are equal
    ...
    return false;
}

その点に注意してください:

  1. コンパレーターと typedef された multimap は、多くのコードで美しく機能します (上記には示されていません)。
  2. テスト ファイルは、その .h ファイルで宣言および定義された他の多くの関数を呼び出しますが、別の .cpp ファイルで定義された関数を呼び出すのはこれが初めてです
  3. 私の質問は、「onesy.insert」呼び出しに比較機能が必要な理由ではありません。という事は承知しています。実際にコンパレーターを使用するテスト セットでコード化した最初のマルチマップ操作です。

色々予感はありますが、尽きてしまったので、どなたかご存知の方がいらっしゃれば教えていただけるとありがたいです。

ノルム

4

1 に答える 1

0

@panta rei: コメントでキーを提供しました。(申し訳ありませんが、ここにギリシャ文字を入力する方法がわかりません。)

問題は基本的に、リンクするオブジェクトを Visual Studio に伝える方法がわからなかったことです。AnalyticsUTest は AnalysticsUTested に依存しているとソリューションに伝えましたが、リンク手順はソリューションではなくプロジェクト (AnalyticsUTest) によって実行されるため、この .lib ファイルを含めるようにプロジェクトに指示する必要がありました。

そこで、プロジェクトのプロパティ シートに移動し、2 つの新しいマクロを作成しました。 CPPUTEST_LIB* マクロ。

そして、$(ANALYTICSUTESTED_LIB_PATHS) を [リンカー] > [全般] > [追加のライブラリ ディレクトリ] に追加しました。そして、 $(ANALYTICSUTESTED_LIB_DEPENDENCIES) をリンカー > 入力 > 追加の依存関係に追加しました。

そして、それは私の問題を解決しました!(私のような別の初心者がやって来て必要になった場合に備えて、ここで詳しく説明しました。)

ありがとう、パンタレイ。コメントで提供された回答に対してポイントを与えるにはどうすればよいですか?

于 2014-12-15T17:16:41.867 に答える