当符号在 .lib 中定义时,为什么在 VS2010 (lnk2001) 中"unresolved external symbol"?C++、升压、cpputest

Why "unresolved external symbol" in VS2010 (lnk2001) when symbol is defined in .lib? C++, boost, cpputest

本文关键字:external unresolved cpputest symbol C++ 升压 定义 lib 符号 VS2010 为什么      更新时间:2023-10-16

我从链接器收到此错误:

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 文件上的转储箱/符号的输出中看到以下内容:

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'd多映射在许多代码中都能很好地工作(上面未显示(。
  2. 测试文件调用在该 .h 文件中声明和定义的许多其他函数,但这是我第一次尝试调用在单独的 .cpp 文件中定义的函数
  3. 我的问题不是为什么"onesy.insert"调用需要比较器功能。我明白这一点。它恰好是我在实际使用比较器的测试集中编码的第一个多重映射操作。

我有各种预感,但我已经用完了,所以如果知道这些东西的人能给我任何线索,我将不胜感激。

规范

@panta rei:您在评论中提供了密钥。(抱歉,无法弄清楚如何在此处键入希腊字母。

问题基本上是我不知道如何告诉Visual Studio要链接哪些对象。我已经告诉我的解决方案,AnalyticsUTest依赖于AnalysticsUTested,但链接步骤是由项目(AnalyticsUTest(而不是解决方案执行的,所以我需要告诉项目包含这个.lib文件。

因此,我转到项目的属性表并创建了两个新宏,一个给出VS放置我的.lib文件(ANALYTICSUTESTED_LIB_PATHS(的文件夹,另一个给出我的.lib文件(ANALYTICSUTESTED_LIB_DEPENDENCIES(的名称 - 两者都类似于CPPUTEST_LIB*宏。

然后我添加了 $(ANALYTICSUTESTED_LIB_PATHS( 到 Linker> 常规>附加库目录。我将 $(ANALYTICSUTESTED_LIB_DEPENDENCIES( 添加到链接器>输入>其他依赖项。

这解决了我的问题!(我在这里详细说明了,以防像我这样的新手出现并需要它。

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