phi*_*o37 90 c++ testing error-handling lnk2019
我收到此错误,但我不知道如何修复它.
我正在使用Visual Studio 2013.我制作了解决方案名称MyProjectTest 这是我的测试解决方案的结构:

- function.h
#ifndef MY_FUNCTION_H
#define MY_FUNCTION_H
int multiple(int x, int y);
#endif
Run Code Online (Sandbox Code Playgroud)
-function.cpp
#include "function.h"
int multiple(int x, int y){
return x*y;
}
Run Code Online (Sandbox Code Playgroud)
- 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;
}
Run Code Online (Sandbox Code Playgroud)
我是初学者; 这是一个简单的程序,它运行没有错误.我在互联网上阅读并对单元测试感兴趣,所以我创建了一个测试项目:
文件>新建>项目...>已安装>模板> 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
}
};
}
Run Code Online (Sandbox Code Playgroud)
但我得到错误LNK2019:未解析的外部符号.我知道缺少函数multiple的实现.我试图删除function.cpp文件,我用定义替换了声明,然后运行.但不建议在同一文件中写入声明和定义.如何在不这样做的情况下修复此错误?我应该用#include "../MyProjectTest/function.cpp"文件unittest.cpp 替换吗?
(我不太擅长英语.谢谢)
kev*_*sco 68
一种选择是包含function.cpp在您的UnitTest1项目中,但这可能不是最理想的解决方案结构.对您的问题的简短回答是,在构建UnitTest1项目时,编译器和链接器不知道function.cpp存在,并且也没有任何链接包含定义multiple.解决这个问题的方法是使用链接库.
由于您的单元测试是在不同的项目中,我假设您的目的是使该项目成为一个独立的单元测试程序.使用您正在测试的功能位于另一个项目中,可以将该项目构建为动态或静态链接的库.静态库在构建时链接到其他程序,并具有扩展.lib,动态库在运行时链接,并具有扩展名.dll.对于我的回答,我更喜欢静态库.
您可以通过在项目属性中更改它来将第一个程序转换为静态库."常规"选项卡下应该有一个选项,其中项目设置为构建为可执行文件(.exe).您可以将其更改为.lib.该.lib文件将构建到与...相同的位置.exe.
在UnitTest1项目中,您可以转到其属性,并在"附加库目录"类别的"链接器"选项卡下,添加MyProjectTest构建的路径.然后,对于Linker - Input选项卡下的Additional Dependencies,最有可能添加静态库的名称MyProjectTest.lib.
这应该允许您的项目构建.请注意,通过这样做,MyProjectTest除非您根据需要更改其构建属性,否则它将不是独立的可执行程序,这将不太理想.
小智 36
在Visual Studio解决方案树中右键单击项目'UnitTest1'然后添加 - >现有项 - >选择文件../MyProjectTest/function.cpp
har*_*ygg 15
由于我希望我的项目编译为独立的EXE,我将UnitTest项目链接到从function.cpp生成的function.obj文件,它可以工作.右键单击'UnitTest1'项目>配置属性>链接器>输入>附加依赖项>添加"..\MyProjectTest\Debug\function.obj"
我刚刚在Visual Studio 2013中遇到了这个问题.显然现在,在同一个解决方案中设置两个项目并设置依赖项是不够的.您需要在它们之间添加项目引用.要做到这一点:
可以得到此链接器错误的另一种方式(就像我以前一样)是,如果要从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
Run Code Online (Sandbox Code Playgroud)
因此,即使主要是我仅导出上述Book类的实例book,我也必须将该Book类声明为export / import类,否则book.WordCount()在其他dll中进行调用会导致链接错误。