函数定义在 cpp 文件中时出现链接器错误

Phl*_*das 3 c++ linker

我的解决方案有三个项目:GoogleTest(用于使用 Google Test)、Vi(用于大部分逻辑)和 ViTests(用于使用 Vi 的单元测试)。ViTests 项目引用了 Vi 项目和 Google Test 项目。

vi在v1.h中有如下代码

#pragma once

namespace Vi
{
    class Vi1
    {
    public:
        int SomeInt();
    };
}
Run Code Online (Sandbox Code Playgroud)

和匹配的 v1.cpp

#include "vi1.h"

namespace Vi
{
    int Vi1::SomeInt()
    {
        return 123;
    }
}
Run Code Online (Sandbox Code Playgroud)

ViTests中的测试功能如下

TEST(Vi1Foo, SomeIntIsSame)
{
    Vi1 v = Vi1{};
    EXPECT_EQ(123, v.SomeInt());
}
Run Code Online (Sandbox Code Playgroud)

链接器错误说有一个未解析的符号SomeInt。但是,我可以通过像这样内联函数来消除链接器错误:

namespace Vi
{
    class Vi1
    {
    public:
        int SomeInt() { return 123; }
    };
}
Run Code Online (Sandbox Code Playgroud)

为什么将单元测试项目SomeInt放在单独的 cpp 文件中时找不到函数定义?

谢谢。

额外的细节很有用:我正在使用 Visual Studio 2015。

错误信息:

Error   LNK2019 unresolved external symbol "public: int __thiscall Vi::Vi1::SomeInt(void)" (?SomeInt@Vi1@Vi@@QAEHXZ) referenced in function "private: virtual void __thiscall ViTests::Vi1Foo_SomeIntIsSame_Test::TestBody(void)" (?TestBody@Vi1Foo_SomeIntIsSame_Test@ViTests@@EAEXXZ) Vi_Tests    C:\Users\MyName\Vi\Vi_Tests\Vi_Tests.obj    1
Run Code Online (Sandbox Code Playgroud)

项目类型:Vi 是 Win32 Application,ViTests 是 Win32 Console Application,GoogleTest 是一个静态库。

Phl*_*das 5

我在一个愚蠢的错误假设下工作。我假设 VS 只会获取 cpp 文件,因为我正在引用包含它们的项目并包含正确的头文件,但事实并非如此。

nabijaczleweli 说我应该“链接到带有函数定义的文件”。在网上探索了一些之后,我发现了如何做到这一点。我发现这篇文章概述了一个解决方案。cpp 文件本身必须添加到测试项目中。这是通过右键单击 ViTests,选择“添加现有文件”并选择 vi1.cpp 来完成的。

这有效,但我对这个解决方案非常不满意,因为我必须在需要时添加这些文件。我发现我可以解决这个将 Vi 的项目类型更改为静态库的问题。这在此处进行了描述。Michael Burr 的评论描述了一种链接到同样有效的目标文件的方法。

如果没有这个帖子中的海报的帮助,我不会这么快就想通了。非常感谢人们。