Unit testing google测试框架中未解析的外部符号
我试图通过VisualStudioCommunity2019实现google测试框架,以便将dll库验证到我现有的解决方案中。基本上,我有3个文件: 源代码构建在单个dll项目中Unit testing google测试框架中未解析的外部符号,unit-testing,linker,googletest,Unit Testing,Linker,Googletest,我试图通过VisualStudioCommunity2019实现google测试框架,以便将dll库验证到我现有的解决方案中。基本上,我有3个文件: 源代码构建在单个dll项目中 FooCmdMgr.cpp FooCmdMgr.h 单元测试代码使用最新的谷歌测试框架,在其他项目中使用同一解决方案的源代码 FooCmdMgr_Test.cpp FooCmdMgr.h class FooCmdMgr { public: FooCmdMgr(const FooCmdMgr&)
FooCmdMgr.cpp
FooCmdMgr.h
单元测试代码使用最新的谷歌测试框架,在其他项目中使用同一解决方案的源代码
FooCmdMgr_Test.cpp
FooCmdMgr.h
class FooCmdMgr
{
public:
FooCmdMgr(const FooCmdMgr&) = delete;
FooCmdMgr& operator=(const FooCmdMgr& ) = delete;
bool func_1() {
return true;
}
private:
FooCmdMgr();
~FooCmdMgr();
static FooCmdMgr& Instance ( );
friend FooCmdMgr& GetFooCmdMgr ( );
};
inline FooCmdMgr& GetFooCmdMgr()
{
return FooCmdMgr::Instance();
}
FooCmdMgr\u Test.cpp
#include "stdafx.h"
#include "../FooCmdMgr.h"
TEST_F(CJobChangeTestFixture, UnitTest2) {
FooCmdMgr& FooCmdMgr = ICmdEx::FooCmdMgr();
//bool bRet = FooCmdMgr.func_1();
//EXPECT_EQ(bRet, true);
}
解决方案编写成功,但链接器不正常。
它显示了错误LNK2019,如下所示:
Severity Code Description Project File Line Suppression State
Error LNK2019 unresolved external symbol "private: static class ICmdEx::FooCmdMgr & __cdecl ICmdEx::FooCmdMgr::Instance(void)" (?Instance@FooCmdMgr@ICmdEx@@CAAEAV12@XZ) referenced in function "class ICmdEx::FooCmdMgr & __cdecl ICmdEx::GetIKYCmdMgr(void)" (?GetIKYCmdMgr@ICmdEx@@YAAEAVFooCmdMgr@1@XZ) IEditorDll_GTest E:\work\project\UnitTest\FooCmdMgr_Test.obj
项目结构
E:\work\project\FooCmdMgr.vcxproj
E:\work\project\FooCmdMgr.cpp
E:\work\project\FooCmdMgr.h
E:\work\project\FooCmdMgr.dll
E:\work\project\FooCmdMgr.lib
谷歌测试项目
E:\work\project\UnitTest\FooCmdMgr_Test.vcxproj
E:\work\project\UnitTest\FooCmdMgr_Test.cpp
我还更改了gtest项目中链接器的配置
一般/附加库目录
$(ProjectDir)../
输入/附加依赖项/
FooCmdMgr.lib
我正在努力弄清楚linker到底发生了什么?请给我建议。你的Foo课程应该是这样的
#pragma once
#ifdef PROJECT1_EXPORTS
#define PROJECT1_API __declspec(dllexport)
#else
#define PROJECT1_API __declspec(dllimport)
#endif
class PROJECT1_API Foo
{
};
PROJECT1\u导出在主源预处理器项目中定义。
而且它不会在您的测试项目中定义您是否已将
FooCmdMgr
的依赖项添加到您的测试目标中?类似于cmakelitts.txt中的target\u link\u库(test\u target\u name FooCmdMgr)
。我在项目中没有使用CMake。FoOCDMGRR是MFC动态链接库,所以在Visual Studio中需要引用受试的LIB,请参阅@夸拉:谢谢您的回答,您提到的文章与微软本机C++单元测试框架有关。然而,我必须为我的项目应用Google测试框架。此外,我还在“reference”中添加了相关的lib。效果不太好。此外,如果我在FooCmdMgr.h中创建一个更简单的类,并注释掉“class FooCmdMgr”。它工作正常。
E:\work\project\UnitTest\FooCmdMgr_Test.vcxproj
E:\work\project\UnitTest\FooCmdMgr_Test.cpp