未解析的外部符号x-使用来自同一解决方案中另一个项目的一个Visual Studio项目测试代码的增强测试

问题描述 投票:0回答:1

我有一个Visual Studio解决方案,其中包含两个项目。它们都保存在单独的文件夹中。主项目(在我的情况下为EquitCalculatorMontecarlo)包含一个可以自行工作的主要功能。第二个项目包含应该测试主项目的boost测试。

我的问题是,当我尝试使用测试浏览器运行测试时,从链接程序中收到错误消息:

Error   LNK2019 unresolved external symbol "bool __cdecl eval_best_hand(class std::vector<class std::set<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,struct std::less<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > >,class std::allocator<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > > >,class std::allocator<class std::set<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,struct std::less<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > >,class std::allocator<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > > > > > const &)" (?eval_best_hand@@YA_NAEBV?$vector@V?$set@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@U?$less@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@V?$allocator@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@@std@@V?$allocator@V?$set@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@U?$less@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@V?$allocator@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@@std@@@2@@std@@@Z) referenced in function "public: void __cdecl card_evaluation1::test_method(void)" (?test_method@card_evaluation1@@QEAAXXZ)  Tests   C:\Users\dickr\git\EquityCalculatorMontecarlo\Tests\Test.obj    1       

我按照这里的指示进行:https://docs.microsoft.com/en-us/visualstudio/test/how-to-use-boost-test-for-cpp?view=vs-2019

完整的代码在这里可见:https://github.com/dickreuter/PokerEquityCalculator

但是这里是一个简短的摘要:

/ Tests / Test.cpp

#define BOOST_TEST_DYN_LINK
#define BOOST_TEST_MODULE HandEvaluationTests

#include <boost/test/included/unit_test.hpp>
#include "../EquityCalculatorMontecarlo/Deck.h"
#include "../EquityCalculatorMontecarlo/Scoring.h"

BOOST_AUTO_TEST_CASE(card_evaluation1)
.....

/ EquityCalculatorMontecarlo / Scoring.cpp

various function definitions

/ EquityCalculatorMontecarlo / Scoring.h

using CardsWithTableCombined = std::set<std::string>;
using Score = std::vector<std::tuple<int, int>>;

bool eval_best_hand(const std::vector<CardsWithTableCombined>&);
std::tuple< std::vector<int>, std::vector<int>, std::string> calc_score(const CardsWithTableCombined&);

template<typename T>
std::vector<T> slice(std::vector<T> const& v, int m, int n)
{
    if (m > v.size())
.....

/ EquityCalculatorMontecarlo / Deck.h

various function declarations

/ EquityCalculatorMontecarlo / Deck.cpp

various function definitions

测试项目无法访问我的主要EquityCalculatorMontecarlo项目可能是什么问题?我也尝试将其选择为依赖项,但似乎无济于事。我无法运行测试。

任何建议都会受到赞赏。

c++ visual-studio linker-errors visual-studio-2019
1个回答
1
投票

eval_best_hand的定义及其依赖性仅在作为可执行文件的EquityCalculatorMontecarlo项目中存在,您只是从Tests项目的头文件中引用eval_best_hand的函数声明,但未链接它们。您可以将在其他项目(可执行文件)中指定要使用的任何功能的定义定义到公共静态库(Say Utils.lib)中,然后将项目链接到该静态库,或者包括所有包含以下内容的.cpp文件: Tests.vcxproj的必要功能。

[我认为,只需将Scoring.cpp和Deck.cpp添加到Tests.vcxproj即可解决链接器错误。

您还可以单独使用Scoring.cpp和Deck.cpp创建一个单独的项目,即“ Utils.lib”,并将该lib链接到您要使用的任何可执行项目。

© www.soinside.com 2019 - 2024. All rights reserved.