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;
};

请注意,我尝试将上面的“struct”更改为“class”,但没有任何效果。

这是调用代码(在 cputest 测试文件中):

#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 文件。

所以我去了项目的属性表并创建了两个新宏,一个给出了 VS 放置我的 .lib 文件的文件夹(ANALYTICSUTESTED_LIB_PATHS),另一个给出了我的 .lib 文件的名称(ANALYTICSUTESTED_LIB_DEPENDENCIES)——两者都与CPPUTEST_LIB* 宏。

然后我将 $(ANALYTICSUTESTED_LIB_PATHS) 添加到 Linker > General > Additional Library Directories。我将 $(ANALYTICSUTESTED_LIB_DEPENDENCIES) 添加到 Linker > Input > Additional Dependencies。

这解决了我的问题!(我已经在这里拼出来了,以防另一个像我这样的新手出现并需要它。)

谢谢你,潘塔雷。对于通过评论提供的答案,我如何给你积分?

于 2014-12-15T17:16:41.867 回答