visual studio 2010 — почему «нерешенный внешний символ» в VS2010 (lnk2001), когда символ определяется в .lib? C ++, boost, cpputest

Я получаю эту ошибку от компоновщика:

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 файле. Я вижу следующее в выводе из dumpbin / symbols в этот файл .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;
};

Обратите внимание, что я попытался изменить ‘struct’ выше на ‘class’, но безрезультатно.

Вот код вызова (в тестовом файле 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. Компаратор и multidep typedef’d прекрасно работают в большом количестве кода (не показан выше).
  2. Тестовый файл вызывает множество других функций, объявленных и определенных в этом файле .h, но это первый раз, когда я пытался вызвать функцию, определенную в отдельном файле .cpp.
  3. Мой вопрос не почему для вызова onesy.insert требуется функция компаратора. Я это понимаю. Это просто первая мультикартовая операция, которую я закодировал в наборе тестов, который фактически использует компаратор.

У меня есть различные догадки, но я исчерпываю их, поэтому, если кто-то, кто знает об этом материале, может дать мне какие-либо подсказки, я был бы очень благодарен.

Норма

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 Directory. И я добавил $ (ANALYTICSUTESTED_LIB_DEPENDENCIES) в Линкер> Вход> Дополнительные зависимости.

И это решило мою проблему! (Я прописал это здесь на случай, если придет еще один такой новичок, как я, и ему понадобится.)

Спасибо, Панта Рей. Как я могу дать вам очки за ответ, предоставленный через комментарий?

0

Другие решения


По вопросам рекламы [email protected]