Saturday 20 January 2018

c++ - How to solve the error LNK2019: unresolved external symbol - function?

itemprop="text">

I get this error, but I don't know how
to fix it.



I'm using Visual Studio 2013. I made
the solution name MyProjectTest
This is the
structure of my test solution:



src="https://i.stack.imgur.com/uRUex.png" alt="The
structure">




-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

#include
#include
"function.h"
using namespace std;

int main(){

int a, b;
cin >> a >> b;
cout << multiple(a, b)
<< endl;


system("pause");
return
0;
}


I'm a
beginner; this is a simple program and it runs without error.
I read in the
internet and became interested in the unit test, so I created a test
project:



File > New > Project...
> Installed > Templates > Visual C++ > Test > Native Unit Test Project
>




Name:
UnitTest1
Solution: Add to
solution

Then the location auto-switched to the path of the current
open solution
This is the folder structure of the
solution:



src="https://i.stack.imgur.com/cvsCE.png" alt="Folder
structure">



I only edited file
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
}


};

}


But
I get error LNK2019: unresolved external symbol.
I know that the
implementation of function multiple is missing.
I tried
to delete the function.cpp file and I replaced the declaration with the definition, and
it run. But writing both declaration and definition in the same file is not
recommended.
How can I fix this error without doing that? Should I replace
with #include "../MyProjectTest/function.cpp" in file
unittest.cpp?
(I'm not good at English very much.
Thanks)


itemprop="text">
class="normal">Answer



One option
would be to include function.cpp in your
UnitTest1 project, but that may not be the most ideal solution
structure. The short answer to your problem is that when building your
UnitTest1 project, the compiler and linker have no idea that
function.cpp exists, and also have nothing to link that
contains a definition of multiple. A way to fix this is making
use of linking libraries.




Since your
unit tests are in a different project, I'm assuming your intention is to make that
project a standalone unit-testing program. With the functions you are testing located in
another project, it's possible to build that project to either a dynamically or
statically linked library. Static libraries are linked to other programs at build time,
and have the extension .lib, and dynamic libraries are linked
at runtime, and have the extension .dll. For my answer I'll
prefer static libraries.



You can turn your first
program into a static library by changing it in the projects properties. There should be
an option under the General tab where the project is set to build to an executable
(.exe). You can change this to .lib.
The .lib file will build to the same place as the
.exe.



In your
UnitTest1 project, you can go to its properties, and under the
Linker tab in the category Additional Library Directories, add the path to which
MyProjectTest builds. Then, for Additional Dependencies under
the Linker - Input tab, add the name of your static library, most likely
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.


No comments:

Post a Comment

php - file_get_contents shows unexpected output while reading a file

I want to output an inline jpg image as a base64 encoded string, however when I do this : $contents = file_get_contents($filename); print &q...