首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何解决错误LNK2019: unresolved symbol - function?

如何解决错误LNK2019: unresolved symbol - function?
EN

Stack Overflow用户
提问于 2013-11-10 12:47:55
回答 12查看 529.1K关注 0票数 114

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

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

-function.h

代码语言:javascript
复制
#ifndef MY_FUNCTION_H
#define MY_FUNCTION_H

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

-function.cpp

代码语言:javascript
复制
#include "function.h"

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

-main.cpp

代码语言:javascript
复制
#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;
}

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

菜单文件→新建→项目...→Installed→Templates→Visual→本机单元测试项目→

姓名: UnitTest1

解决方案:添加到解决方案

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

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

我只编辑了文件unittest1.cpp

代码语言:javascript
复制
#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:无法解析外部符号。

我知道缺少函数multiple的实现。我尝试删除function.cpp文件,并将声明替换为定义,然后它就运行了。但不推荐在同一文件中同时编写声明和定义。

如果不这样做,我如何修复这个错误?我应该在unittest.cpp文件中用#include "../MyProjectTest/function.cpp"替换它吗?

EN

回答 12

Stack Overflow用户

回答已采纳

发布于 2013-11-10 13:47:48

一种选择是在您的UnitTest1项目中包含function.cpp,但这可能不是最理想的解决方案结构。对您的问题的简短回答是,在构建UnitTest1项目时,编译器和链接器不知道function.cpp的存在,也无法链接包含multiple定义的内容。解决这个问题的一种方法是使用链接库。

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

您可以通过在项目属性中更改第一个程序来将其转换为静态库。在General选项卡下应该有一个选项,其中项目设置为build to an executable (.exe)。您可以将其更改为.lib.lib文件将构建到与.exe相同的位置。

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

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

票数 89
EN

Stack Overflow用户

发布于 2013-11-10 13:09:20

在Visual Studio解决方案树中,右键单击项目“UnitTest1”,然后添加→Existing item→选择文件../MyProjectTest/function.cpp。

票数 41
EN

Stack Overflow用户

发布于 2015-06-05 21:17:56

由于我希望将我的项目编译为独立的EXE文件,因此我将UnitTest项目链接到从function.cpp生成的function.obj文件,它就可以工作了。

右键单击'UnitTest1‘项目→Configuration Properties→Linker→Input→Additional Dependencies→add "..\MyProjectTest\Debug\function.obj“。

票数 19
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19886397

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档