如何解决错误 LNK2019: 未解决的外部符号功能?

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

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

The structure

函数 h

#ifndef MY_FUNCTION_H
#define MY_FUNCTION_H


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

- function. 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;
}

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

菜单 档案New计划..。已安装模板Visual C + + 测试本地单元测试项目

姓名: UnitTest1
Solution: Add to solution

然后位置自动切换到当前开放解的路径。

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

Folder structure

我只编辑了文件 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: 未解析的外部符号。

我知道函数 多个的实现缺失了。 I tried to delete the Cpp file and I replaced the declaration with the definition, and it ran. But writing both declaration and definition in the same file is not recommended.

如何在不这样做的情况下修复这个错误? 是否应该在 unittest.cpp 文件中用 #include "../MyProjectTest/function.cpp"替换它?

576407 次浏览

在 Visual Studio 解决方案树中,右键单击项目“ UnitTest1”,然后 现有物品→选择文件 . ./MyProjectTest/function. cpp

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

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

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

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

That should allow your project to build. Note that by doing this, MyProjectTest will not be a standalone executable program unless you change its build properties as needed, which would be less than ideal.

Since I want my project to compile to a stand-alone EXE file, I linked the UnitTest project to the 函数 obj file generated from Cpp and it works.

右键单击“ UnitTest1”项目→ 配置属性连接器输入其他附属事项添加“ . . MyProjectTest Debug function tion.obj”

我在 VisualStudio2013中遇到了这个问题。显然,现在在同一个解决方案中有两个项目并设置依赖项是不够的。您需要在它们之间添加一个项目引用。要做到这一点:

  1. 在解决方案探索中右键单击项目
  2. 单击 Add = > References..。
  3. Click the Add New Reference button
  4. 选中此项目所依赖的项目的复选框
  5. 单击 OK

事实证明,我正在使用.c 文件和.cpp 文件。将.c 重命名为.cpp 解决了我的问题。

对于我来说,如果我在 itemGroup cpp 文件中的 .vcxproj中添加这一行,它就可以工作了,该文件连接到头文件。

<ClCompile Include="file.cpp" />

另一种获得这个链接器错误的方法是(像我一样)从 DLL 文件导出类的 例子,但是没有将该类本身声明为 import/export。

#ifdef  MYDLL_EXPORTS
#define DLLEXPORT __declspec(dllexport)
#else
#define DLLEXPORT __declspec(dllimport)
#endif


class DLLEXPORT Book // <--- This class must also be declared as export/import
{
public:
Book();
~Book();
int WordCount();
};


DLLEXPORT extern Book book; // <-- This is what I really wanted, to export book object

因此,尽管我主要导出的只是上面的 Book 类的 例子,但是我必须将 Book类声明为 export/import 类,否则在另一个 DLL 文件中调用 book.WordCount()会导致链接错误。

I just discovered that LNK2019 occurs during compilation in Visual Studio 2015 if forgetting to provide a definition for a declared function inside a class.

The linker error was highly cryptic, but I narrowed it down to what was missing by reading through the error and provided the definition outside the class to clear this up.

检查两个项目在 配置属性将军字符集中的字符集。

我的 UnitTest 项目使用默认字符集 多字节,而我的库在 Unicode中。

我的函数使用 TChar作为参数。

结果,在我的库中,我的 TChar变了变成 WCHAR,但是在我的 UnitTest 中它是 Char * : 符号不同,因为最终参数实际上并不相同。

在 VisualStudio2017中,如果要测试公共成员,只需将实际项目和测试项目放在同一个解决方案中,并在测试项目中添加对实际项目的引用。

有关详细信息,请参阅 MSDN blog 中的 Visual Studio 中的 C + + 单元测试。您还可以检查 Write unit tests for C/C++ in Visual Studio在 VisualStudio 中使用 Microsoft C + + 单元测试框架,后者是如果您需要测试非公共成员,并且需要将测试放在与您的实际代码相同的项目中。

请注意,您想要测试的内容需要使用 __declspec(dllexport)导出。请参阅 使用 _ _ decspec (dllexport)从 DLL 导出了解更多细节。

在我的示例中,将 cpp 文件设置为“ property”-> “ general”中的“ C/C + + 编译器”,解决 LNK2019错误。

在头文件 function. h include 的开头

#ifdef __cplusplus
extern "C" {
#endif

像这样:

    #ifndef MY_FUNCTION_H
#define MY_FUNCTION_H
    

#ifdef __cplusplus
extern "C" {
#endif
    

int multiple(int x, int y);


#ifdef __cplusplus
}
#endif
    

#endif

这将告诉单元测试项目上的 cpp 编译器编译此文件。H 文件作为 C 文件,生成具有预期符号名称的对象