如何解决错误LNK2019:无法parsing的外部符号 – 函数?

我得到这个错误,但我不知道如何解决它。

我正在使用Visual Studio 2013.我提出了解决scheme名称MyProjectTest这是我的testing解决scheme的结构:

结构

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

我是初学者 这是一个简单的程序,它运行没有错误。 我在网上阅读,对unit testing感兴趣,所以我创build了一个testing项目:

文件>新build>项目…>安装>模板> Visual C ++>testing>原生unit testing项目>

名称: UnitTest1解决scheme: 添加到解决scheme然后位置自动切换到当前打开解决scheme的path这是解决scheme的文件夹结构:

文件夹结构

我只编辑了文件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:无法parsing的外部符号我知道它缺less函数倍数的实现。 我试图删除文件function.cpp并用定义replace声明,然后运行。 但是不build议在同一个文件中写入声明和定义。 我怎样才能解决这个错误没有这样做? 我应该用文件unittest.cpp中的#include "../MyProjectTest/function.cpp"replace吗? (我不太擅长英语,谢谢)

一个select是在您的UnitTest1项目中包含function.cpp ,但这可能不是最理想的解决scheme结构。 您的问题的简短答案是,当您构build您的UnitTest1项目,编译器和链接器不知道function.cpp存在,也没有什么可以包含multiple定义的链接。 一种解决这个问题的方法是利用链接库。

由于你的unit testing是在一个不同的项目中,我假设你的意图是使该项目成为一个独立的unit testing程序。 使用您正在testing的函数位于另一个项目中,可以将该项目构build为dynamic链接库或静态链接库。 静态库在构build时链接到其他程序,并具有扩展名.lib ,dynamic库在运行时链接,并具有扩展名.dll 。 对于我的答案,我宁愿静态库。

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

在您的UnitTest1项目中,您可以转到其属性,然后在“附加库目录”类别的“链接器”选项卡下添加MyProjectTest构build的path。 然后,对于链接器 – input选项卡下的其他依赖关系,添加静态库的名称,很可能是MyProjectTest.lib

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

在Visual Studio解决scheme树中,右键单击项目“UnitTest1”,然后selectAdd – > Existing item – >select文件../MyProjectTest/function.cpp

由于我想我的项目编译为独立的EXE,我将UnitTest项目链接到从function.cpp生成的function.obj文件,它的工作原理。 右键单击“UnitTest1”项目>configuration属性>链接器>input>其他依赖项>添加“.. \ MyProjectTest \ Debug \ function.obj”

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

  1. 在解决scheme探索中右键单击项目
  2. 点击添加=>参考…
  3. 点击Add New Referencebutton
  4. 选中该项目所依赖的项目框
  5. 点击OK

原来我用.cpp文件使用.c文件。 重命名.c到.cpp解决了我的问题。

对于我的作品,如果我添加这条线在.vcxproj itemGroup cpp文件,这是连接到头文件。

 <ClCompile Include="file.cpp" /> 

另一种方式,你可以得到这个链接器错误(就像我)是如果你从一个DLL导出一个类的实例,并在另一个模块中使用其成员variables。

  #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; 

因此,即使主要是导出Book类的一个实例,我也必须将Book类声明为导出/导入类,否则使用导出的其他实例调用WordCount()导致链接错误。

我刚刚发现LNK2019在Visual Studio 2015编译过程中发生,如果忘记提供一个类中声明函数的定义。

链接器的错误是非常隐晦的,但是我通过阅读错误来缩小错误的范围,并且在课堂之外提供了定义来清除错误。