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

Unresolved external symbol x - using boost tests from one visual studio project testing code of another project in the same solution

我有一个包含两个项目的 visual studio 解决方案。它们都保存在一个单独的文件夹中。主项目(在我的例子中是 EquitCalculatorMontecarlo)包含一个可以独立运行的主函数。第二个项目包含应该测试主项目的提升测试。

我的问题是,当我尝试 运行 使用测试资源管理器进行测试时,我从链接器收到一条错误消息:

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 项目可能是什么问题?我也曾尝试 select 它作为依赖项,但似乎没有任何帮助。我不能 运行 测试。

非常感谢任何建议。

eval_best_hand 的定义及其依赖项仅存在于作为可执行文件的 EquityCalculatorMontecarlo 项目中,您只是从测试项目的头文件中引用 eval_best_hand 的函数声明,而不是 link他们。您要么将指定用于其他项目(可执行文件)的任何函数定义为一个公共静态库(比如 Utils.lib),然后 link 您的项目针对该静态库或包括所有 .cpp包含 Tests.vcxproj.

必要函数定义的文件

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

您也可以创建一个单独的项目,即 "Utils.lib",仅包含 Scoring.cpp 和 Deck.cpp 源文件,link 该库指向需要使用这些文件的任何可执行项目实用方法。这基本上是为了达到重复使用和方便维护的目的。在这种情况下,您的主项目 (EquityCalculatorMontecarlo) 可能只包含一个主函数和代码以使用 Scoring.h 和 Deck.h 中的函数(Utils.lib 中存在的定义)。