如何解决错误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中拥有两个项目并设置依赖关系是不够的。 您需要在它们之间添加项目引用。 要做到这一点:
- 在解决scheme探索中右键单击项目
- 点击添加=>参考…
- 点击Add New Referencebutton
- 选中该项目所依赖的项目框
- 点击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编译过程中发生,如果忘记提供一个类中声明函数的定义。
链接器的错误是非常隐晦的,但是我通过阅读错误来缩小错误的范围,并且在课堂之外提供了定义来清除错误。