【问题标题】:visual studio 2017 LNK2019: unresolved external symbol In GoogleTestGoogleMock Projectvisual studio 2017 LNK2019:GoogleTestGoogleMock 项目中未解析的外部符号
【发布时间】:2018-10-02 10:59:53
【问题描述】:

我是 C++ 的菜鸟。我的第一个学习项目使用 GoogleTest 和 GoolgleMock,但是,当然,我也是新手。我通过 NuGet 安装了 googletestmock.v.141 v101。我的主要应用程序 AstronomyCalculations 可以毫无问题地构建和运行。我的测试应用 GMock 在我尝试构建它时抛出了三个 LNK2019 错误。

严重性代码描述项目文件行抑制状态 错误 LNK2019 未解析的外部符号“public: __cdecl Easter::easter(void)”(??0easter@@QEAA@XZ) 在函数“private: virtual void __cdecl GET_THE_DATE_OF_EASTER_ShouldReturnDateOfEaster_Test::TestBody(void)”(?TestBody@GET_THE_DATE_OF_EASTER_ShouldReturnDateOfEaster @EEAAXXZ) GMock D:\Dev\Projects\AstronomyCalculations\GMock\GMock.obj 1

严重性代码描述项目文件行抑制状态 错误 LNK2019 未解析的外部符号“public: __cdecl Easter::~easter(void)”(??1easter@@QEAA@XZ) 在函数“private: virtual void __cdecl GET_THE_DATE_OF_EASTER_ShouldReturnDateOfEaster_Test::TestBody(void)”(?TestBody@GET_THE_DATE_OF_EASTER_ShouldReturnDateOfEaster @@EEAAXXZ) GMock D:\Dev\Projects\AstronomyCalculations\GMock\GMock.obj 1

严重性代码描述项目文件行抑制状态 错误 LNK2019 未解析的外部符号“public: struct tm __cdecl Easter::get_easter_date(int)const” (?get_easter_date@easter@@QEBA?AUtm@@H@Z) 在函数“private: virtual void __cdecl GET_THE_DATE_OF_EASTER_ShouldReturnDateOfEaster_Test::TestBody( void)" (?TestBody@GET_THE_DATE_OF_EASTER_ShouldReturnDateOfEaster_Test@@EEAAXXZ) GMock D:\Dev\Projects\AstronomyCalculations\GMock\GMock.obj 1

// AstronomyCalculations.cpp
int main() {
return 0;
}

// Easter.h
#pragma once
#include <ctime>
#include <string>
class easter
{
public:
easter();
~easter();

tm get_easter_date(int easter_year) const;
};

// Easter.cpp
#include "Easter.h"

easter::easter()
{
}

easter::~easter()
= default;

tm easter::get_easter_date(const int easter_year) const
{
 const auto a = easter_year % 19;
 const auto b = easter_year / 100;
 const auto c = easter_year % 100;
 const auto d = b / 4;
 const auto e = b % 4;
 const auto f = (b + 8) / 25;
 const auto g = (b - f + 1) / 3;
 const auto h = ((19 * a) + b - d - g + 15) % 30;
 const auto i = c / 4;
 const auto k = c % 4;
 const auto l = (32 + (2 * e) + (2 * i) - h - k) % 7;
 const auto m = (a + (11 * h) + (22 * l)) / 451;
 const auto easter_month = (h + l - (7 * m) + 114) / 31;
 const auto easter_day = ((h + l - (7 * m) + 114) % 31) + 1;

 auto date_string = std::to_string(easter_year) +
    "-" + 
    std::to_string(easter_month) + 
    "-" +
    std::to_string(easter_day) +
    " 00:00:00";    

char date[20]; //a 1 char space for null is also required
strcpy_s(date, date_string.c_str());

tm ltm{};
char seps[] = " -:";
char *next_token = nullptr;

auto token = strtok_s(date, seps, &next_token);
ltm.tm_year = strtol(token, nullptr, 10);

token = strtok_s(nullptr, seps, &next_token);
ltm.tm_mon = strtol(token, nullptr, 10);

token = strtok_s(nullptr, seps, &next_token);
ltm.tm_mday = strtol(token, nullptr, 10);

token = strtok_s(nullptr, seps, &next_token);
ltm.tm_hour = strtol(token, nullptr, 10);

token = strtok_s(nullptr, seps, &next_token);
ltm.tm_min = strtol(token, nullptr, 10);

token = strtok_s(nullptr, seps, &next_token);
ltm.tm_sec = strtol(token, nullptr, 10);

ltm.tm_wday = 0;

return ltm;
}


// GMock.cpp
#include "stdafx.h"
#include "gmock/gmock.h"
#include "gtest/gtest.h"
#include "Easter.h"

int main(int argc, char** argv)
{
::testing::InitGoogleMock(&argc, argv);
return RUN_ALL_TESTS();
}

TEST(GET_THE_DATE_OF_EASTER, ShouldReturnDateOfEaster)
{
easter estr;

const auto result = estr.get_easter_date(2000);

ASSERT_EQ(result.tm_year, 2000);
}

【问题讨论】:

    标签: c++ visual-studio-2017 googletest lnk2019 googlemock


    【解决方案1】:

    链接器似乎找不到函数easter::easter(void)easter::~easter(void)easter::get_easter_date(int)const

    您显然包含了 Easter.h(并将其放在您的搜索路径中,否则编译器会抱怨)但您实际上是在编译 easter.cpp 还是它的模拟对象? (据我从您的源代码中可以看出,您实际上也不是在嘲笑该课程)。头文件足以满足编译器的要求,但是当链接器尝试将应用程序放在一起并意识到它缺少目标文件时,它会犹豫 - 抛出 LNK2019。

    我只能强烈建议您深入了解documentation available 的 gtest 和 gmock。

    此外,您还可以重新考虑您的命名方案 - 类类型通常以大写字母开头(即复活节,而不是复活节),以便更好地与变量名(以小写字母开头)区分开来。也不要调用你的变量 a, b, c, d - const auto a 和它的同类是可怕的阅读,调试,你诅咒自己我你曾经发现自己处于拥有的位置几周后重新访问代码。即使这只是一些练习项目,也请练习使用良好的编码标准和命名约定,以便您(自动)在更大的项目中使用它们。

    【讨论】:

    • 感谢您的建议,CharonX。我一直在为 c++ 名称使用 ReSharper 默认值,包括一些个人风格的实验,但我会在做这个学习项目时改变它。我更喜欢在适当的情况下使用 UpperCamel 大小写和 lowerCamelCase。
    【解决方案2】:

    当我发现 GoogleTest 可以作为一个新项目添加到 Visual Studio 2017 中时,我终于解决了这个问题。当然,我必须先删除我原来的测试项目,然后再添加新的测试项目。最后一切都解决了,但是,当然,我不知道为什么链接错误会出现在我的原始测试项目中;除了 CharonX 的见解。

    【讨论】:

      猜你喜欢
      • 2023-03-28
      • 1970-01-01
      • 1970-01-01
      • 2013-06-15
      • 2014-11-07
      • 2013-06-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-20
      相关资源
      最近更新 更多