Unit testing google测试框架中未解析的外部符号

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&)

我试图通过VisualStudioCommunity2019实现google测试框架,以便将dll库验证到我现有的解决方案中。基本上,我有3个文件: 源代码构建在单个dll项目中

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