Googletest C++ unit testing linking error
21,290
I had the same issue. Make sure that in your test project's properties, you go into Project->Linker->General settings and add the msvc/Release
directory to Additional Directories. Furthermore, under Linker->Input, add gtest.lib
into Additional Dependencies. Then you should be good to go!
Author by
hab
Updated on November 24, 2020Comments
-
hab over 3 years
I'm a beginner C++ programmer. I'm trying Google Test in Visual Studio 2012 and have problem starting a demo source code I got from internet.
int CompareChar(char* ch1, char* ch2) { if (ch1 == NULL || ch2 == NULL) return 88; return strcmp(ch1, ch2); } TEST(CompareCharTest, InputChar) { // Expect equal EXPECT_EQ(0, CompareChar("hello", "hello")); // Expect not equal EXPECT_NE(0, CompareChar("hello", "world")); } TEST(SampleClassTest, InputNumber) { SampleClass sample(10); EXPECT_EQ(1, sample.CompareValue(10)); // Expect equal } int _tmain(int argc, _TCHAR* argv[]) { ::testing::InitGoogleTest(&argc, argv); int i = RUN_ALL_TESTS(); getchar(); return i; }
So, when I try to build the code, it generates dozens of linking errors which I couldn't sort out. I tried to include .lib files in the property of the project but couldn't solve it.
The error:
>1>------ Build started: Project: GTestSample, Configuration: Release Win32 ------ >1> stdafx.cpp 1> GTestSample.cpp 1>GTestSample.obj : error LNK2001: unresolved external symbol "public: class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > __thiscall testing::Message::GetString(void)const " (?GetString@Message@testing@@QBE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@XZ) 1>GTestSample.obj : error LNK2001: unresolved external symbol "public: __thiscall testing::Message::Message(void)" (??0Message@testing@@QAE@XZ) 1>GTestSample.obj : error LNK2001: unresolved external symbol "public: static class testing::UnitTest * __cdecl testing::UnitTest::GetInstance(void)" (?GetInstance@UnitTest@testing@@SAPAV12@XZ) 1>GTestSample.obj : error LNK2001: unresolved external symbol "public: int __thiscall testing::UnitTest::Run(void)" (?Run@UnitTest@testing@@QAEHXZ) 1>GTestSample.obj : error LNK2001: unresolved external symbol "protected: __thiscall testing::Test::Test(void)" (??0Test@testing@@IAE@XZ) 1>GTestSample.obj : error LNK2001: unresolved external symbol "public: virtual __thiscall testing::Test::~Test(void)" (??1Test@testing@@UAE@XZ) 1>GTestSample.obj : error LNK2001: unresolved external symbol "class testing::TestInfo * __cdecl testing::internal::MakeAndRegisterTestInfo(char const *,char const *,char const *,char const *,void const *,void (__cdecl*)(void),void (__cdecl*)(void),class testing::internal::TestFactoryBase *)" (?MakeAndRegisterTestInfo@internal@testing@@YAPAVTestInfo@2@PBD000PBXP6AXXZ2PAVTestFactoryBase@12@@Z) 1>GTestSample.obj : error LNK2001: unresolved external symbol "void const * __cdecl testing::internal::GetTestTypeId(void)" (?GetTestTypeId@internal@testing@@YAPBXXZ) 1>GTestSample.obj : error LNK2001: unresolved external symbol "public: void __thiscall testing::internal::AssertHelper::operator=(class testing::Message const &)const " (??4AssertHelper@internal@testing@@QBEXABVMessage@2@@Z) 1>GTestSample.obj : error LNK2001: unresolved external symbol "public: __thiscall testing::internal::AssertHelper::AssertHelper(enum testing::TestPartResult::Type,char const *,int,char const *)" (??0AssertHelper@internal@testing@@QAE@W4Type@TestPartResult@2@PBDH1@Z) 1>GTestSample.obj : error LNK2001: unresolved external symbol "public: __thiscall testing::internal::AssertHelper::~AssertHelper(void)" (??1AssertHelper@internal@testing@@QAE@XZ) 1>GTestSample.obj : error LNK2001: unresolved external symbol "void __cdecl testing::InitGoogleTest(int *,wchar_t * *)" (?InitGoogleTest@testing@@YAXPAHPAPA_W@Z) 1>GTestSample.obj : error LNK2001: unresolved external symbol "bool __cdecl testing::internal::IsTrue(bool)" (?IsTrue@internal@testing@@YA_N_N@Z) 1>GTestSample.obj : error LNK2001: unresolved external symbol "class testing::AssertionResult __cdecl testing::AssertionSuccess(void)" (?AssertionSuccess@testing@@YA?AVAssertionResult@1@XZ) 1>GTestSample.obj : error LNK2001: unresolved external symbol "public: __thiscall testing::AssertionResult::AssertionResult(class testing::AssertionResult const &)" (??0AssertionResult@testing@@QAE@ABV01@@Z) 1>GTestSample.obj : error LNK2001: unresolved external symbol "class testing::AssertionResult __cdecl testing::AssertionFailure(void)" (?AssertionFailure@testing@@YA?AVAssertionResult@1@XZ) 1>GTestSample.obj : error LNK2001: unresolved external symbol "class testing::AssertionResult __cdecl testing::internal::EqFailure(char const *,char const *,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,bool)" (?EqFailure@internal@testing@@YA?AVAssertionResult@2@PBD0ABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@1_N@Z) 1>GTestSample.obj : error LNK2001: unresolved external symbol "protected: virtual void __thiscall testing::Test::SetUp(void)" (?SetUp@Test@testing@@MAEXXZ) 1>GTestSample.obj : error LNK2001: unresolved external symbol "protected: virtual void __thiscall testing::Test::TearDown(void)" (?TearDown@Test@testing@@MAEXXZ) 1>D:\VisualStudioProj\GTestSample\Release\GTestSample.exe : fatal error LNK1120: 19 unresolved externals ========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
-
altumano over 9 yearsThis "Linker->Input" part was missing in my case, thanks!
-
helmesjo over 9 yearsShould this be done manually each time, or is something wrong with the nuget package/install?
-
Oleg Vaskevich over 9 yearsI'm not entirely sure, sorry.
-
Lucian over 8 yearsThis solution is fundamentally incorrect, you should not do such things in programming; it contradicts all coding principles. A real scenario is when you have only the .lib available and not the sources, your solution will not work. The solution in this case is: 1. include the gmock.lib (or whatever name the library has) in your project and 2. if linkage problems with the gmock.lib change C/C++->Code Generation->Runtime Library->change to /MTd (as the .lib is build)
-
Esaith over 8 yearsIt is true that this may not be the best practice, as I had pointed out in my original statement, but the point is if you do have the files - go ahead and copy and paste them right into the directory. You can do this with .lib files as well. This solution worked for me. Once I found that my problem was how I
-
Esaith over 8 yearsOnce I found that my problem was how I was incorrectly linking (to the wrong folder level), I was able to link correctly. This isn't for production but a way to debug possible linking errors. I wrote this one possible route as all other solutions so far on SO did not fix my problem. Regardless of whether it is 'best practice' or not, if it brings you a step closer to realizing where the problem is and brings you to a final solution, so be it. You can always undo it later.
-
Manohar Reddy Poreddy over 6 yearsFollow the steps from here: stackoverflow.com/a/47795243/984471