Я получаю эту ошибку от компоновщика:
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;
}
Обратите внимание, что:
У меня есть различные догадки, но я исчерпываю их, поэтому, если кто-то, кто знает об этом материале, может дать мне какие-либо подсказки, я был бы очень благодарен.
Норма
@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) в Линкер> Вход> Дополнительные зависимости.
И это решило мою проблему! (Я прописал это здесь на случай, если придет еще один такой новичок, как я, и ему понадобится.)
Спасибо, Панта Рей. Как я могу дать вам очки за ответ, предоставленный через комментарий?