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

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

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

I’m the beginner, this is the simple program and it run ok without error. I read in the internet and interested in the unit test, so I creat the test project:

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

Name: UnitTest1 Solution: Add to solution then the location auto switch to the path of current opening solution This is the folder structure of the solution:

Folder structure

I edit only 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 it is missing the implement of functionmultiple. I try to delete file function.cpp and replace the declare with the defination, and it run. But It is not recommend to write both declare and defination in the same file. How can i fix this error without do that. Should I replace with #include "../MyProjectTest/function.cpp" in file unittest.cpp? (I’m not good at english very much. Thanks)

shareedit
BE CAREFUL In a Windows environment, static libraries have a .LIB file extension. To complicate things… dynamic link libraries (i.e. *.DLL) can have an accompanying import library which also has a .LIB file extension. This import library lists all the goodies provided by the *.DLL. For more information, please read:Beginner’s Guide to Linkers –  Pressacco Jun 12 at 19:36

3 Answers

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 UnitTest1project, 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.

shareedit
Advertisements