当前位置: 首页 > 知识库问答 >
问题:

如何解决错误LNK2019:未解析的外部符号-函数?

汪博艺
2023-03-14

我得到了这个错误,但我不知道如何修复它。

我正在使用Visual Studio 2013。我将解决方案命名为MyProjectTest这是我的测试解决方案的结构:

-功能。H

#ifndef MY_FUNCTION_H
#define MY_FUNCTION_H

int multiple(int x, int y);
#endif

-功能。cpp

#include "function.h"

int multiple(int x, int y){
    return x*y;
}

-main.cpp

#include <iostream>
#include <cstdlib>
#include "function.h"

using namespace std;

int main(){
    int a, b;
    cin >> a >> b;
    cout << multiple(a, b) << endl;

    system("pause");
    return 0;
}

我是初学者;这是一个简单的程序,运行时没有错误。我在互联网上阅读并对单元测试感兴趣,因此我创建了一个测试项目:

菜单文件→新建→项目...→已安装→模板→Visual C→测试→本地单元测试项目→

名称:UnitTest1
解决方案:添加到解决方案

然后位置自动切换到当前打开解决方案的路径。

这是解决方案的文件夹结构:

我只编辑了文件unittest1.cpp:

#include "stdafx.h"
#include "CppUnitTest.h"
#include "../MyProjectTest/function.h"

using namespace Microsoft::VisualStudio::CppUnitTestFramework;

namespace UnitTest1
{
    TEST_CLASS(UnitTest1)
    {
    public:

        TEST_METHOD(TestEqual)
        {
            Assert::AreEqual(multiple(2, 3), 6);
            // TODO: Your test code here
        }

    };
}

但我得到:

错误LNK2019:未解析的外部符号。

我知道缺少多功能的实现。我试图删除该函数。cpp文件和我用定义替换了声明,然后它运行了。但不建议在同一文件中同时编写声明和定义。

如果不这样做,我如何修复此错误?我是否应该将其替换为#在文件unittest中包含“./MyProjectTest/function.cpp”。cpp?

共有3个答案

锺宜
2023-03-14

因为我希望我的项目编译成一个独立的EXE文件,所以我将UnitTest项目链接到从function.cpp生成的function.obj文件,并且它可以工作。

右键单击UnitTest1项目→配置属性→链接器→输入→附加依赖项→添加"...\MyProjectTest\Debug\function.obj"。

岳君之
2023-03-14

在VisualStudio解决方案树中,右键单击项目“UnitTest1”,然后添加→ 现有项目→ 选择文件/MyProjectTest/功能。cpp。

祖利
2023-03-14

一个选项是包含函数。您的UnitTest1项目中的cpp,但这可能不是最理想的解决方案结构。问题的简单答案是,在构建UnitTest1项目时,编译器和链接器不知道的功能。cpp存在,并且也没有包含多个定义的链接。解决此问题的一种方法是使用链接库。

由于您的单元测试位于不同的项目中,我假设您的意图是使该项目成为一个独立的单元测试程序。使用位于另一个项目中的测试函数,可以将该项目构建为动态或静态链接库。静态库在构建时链接到其他程序,并具有扩展名。lib和动态库在运行时链接,并具有扩展名。dll。对于我的答案,我更喜欢静态库。

通过在“项目”属性中更改第一个程序,可以将其转换为静态库。“常规”选项卡下应该有一个选项,将项目设置为生成为可执行文件(.exe)。您可以将其更改为。lib。lib文件将构建到与相同的位置。exe

在您的UnitTest1项目中,您可以转到其属性,并在类别附加库目录的链接器选项卡下,添加生成MyProjectTest的路径。然后,对于Linker-Input选项卡下的其他依赖项,添加静态库的名称,很可能是MyProjectTest。lib

这将允许您的项目进行构建。请注意,通过这样做,MyProjectTest将不会是一个独立的可执行程序,除非您根据需要更改它的构建属性,这将不太理想。

 类似资料:
  • 首先,我知道这个问题在这个网站上到处都是,但是我看了几乎所有的问题,似乎找不到问题所在。这是在VS 2012中。谢谢。 这是插座。cpp公司 这是stdafx。h类 这是我的错误消息:

  • 当我运行下面的简单代码时,我有两个错误,如下所示: 错误: msvcrtd.lib(crtexew.obj):错误LNK2019:函数中引用了未解析的外部符号 我该怎么办?

  • 此链接器错误在主目录中。cpp和在foreach中。h级。构造函数和解构器都被标记为错误。 LNK2019:未解析的外部符号 “public:u thiscall FE_Iterator::~FE_Iterator(void)”在函数中引用“public:u thiscall Set,类std::allocator” "公共:__thiscallFE_Iterator::FE_Iterator(无

  • 如何从Visual Studio读取此错误消息?到底缺少什么线索?这是一个复杂的项目,猜测是一种相当无效的方法——我更愿意确切地知道要寻找什么。 1. 1. 1. 完整的错误列表在这里https://gist.github.com/anonymous/91a76564651be4ac43fc

  • 我有一个cpp文件,其中包括: 当尝试运行AcquireCredentialsHandleW时,我得到.. MSDN说它在sspi.h中。

  • 我在我的MFC vtk项目中使用Visual Studio 2008。我收到一个链接错误,如下所示: vtkPBFEAView。obj:警告LNK4217:本地定义的符号?DrawDC@vtkMFCWindow@@QAEXPAVCDC@@@Z(public:void _thiscall vtkMFCWindow::DrawDC(类CDC*))在函数“protected:virtual void _