Search code examples
c++lnk2019unresolved-external

Link error 2019, prototypes are in header file though


I'm new to c++ and was just trying to do a question that involves 3 files.

I got a header file with a namespace that declares a structure and some prototypes. In definitions.cpp file, I have all the function definitions. Then the main.cpp file, just creates a few structures, calls some functions to fill the structures, then calls another function to display the structures.

The problem I have is it gives me an unresolved external error. From what I can gather I think the compiler is complaining that it cant find the prototypes for the functions being called in main.cpp - the overloaded setStruct() and the showStruct().

But I thought when I included the header.h file and declared the functions with the using declaration, in main.cpp, it gave the compiler access to the prototypes stored in the header file?

Header.h

#ifndef header_h
#define header_h

namespace SALES
{
    const int QUARTERS = 4;

    struct Sales
    {
        double sales[QUARTERS];
        double average;
        double max;
        double min;
    };
    void setSales(Sales & s, const double ar[], int n);
    void setSales(Sales & s);
    void showSales(const Sales & s);
}

#endif

Definitions.cpp

#include<iostream>
#include"header.h"
using SALES::Sales;
using SALES::QUARTERS;


double max(Sales & s) //find max sale value in sales array
{
    double maxVal = s.sales[0];
    for(int i = 1; i<4;i++)
    {
        if(s.sales[i]>maxVal)
        {
            maxVal = s.sales[i];  
        }

    }
    return maxVal;
}

double min(Sales & s) //find min sale value in sales array
{
    double minVal = s.sales[0];
    for(int i = 1; i<4;i++)
    {
        if(s.sales[i]<minVal)
        {
            minVal = s.sales[i];  
        }

    }
    return minVal;
}

void setSales(Sales & s) // fill sales structure interactivly
{
    std::cout<< "Please enter the sales for the yearly quarters.\n";
    for(int i = 0;i<QUARTERS;i++)
    {
        std::cout<< "Quater "<<i+1<<": ";
        while(!(std::cin>>s.sales[i]))
        {
            std::cout<<"Please enter valid input\n";
            std::cout<< "Quater "<<i+1<<": ";
            std::cin.clear();
            std::cin.ignore();
        }

    }
    s.average = ((s.sales[0]+s.sales[1]+s.sales[2]+s.sales[3])/4); 
    s.max = max(s);
    s.min = min(s);

}


void setSales(Sales & s, const double ar[], int n) // fill sales structure non interactivly
{
    for(int i = 0;i<n;i++)
    {
        s.sales[i] = ar[i];
    }
    for(int i = n;i<QUARTERS;i++)
    {
        s.sales[i] = 0;
    }
    s.average = ((s.sales[0]+s.sales[1]+s.sales[2]+s.sales[3])/4); 
    s.max = max(s);
    s.min = min(s);


}

void showSales(const Sales & s) // display structure
{
    std::cout<< "\nSales for the year\n";
    for(int i = 0;i<QUARTERS;i++)
    {
        std::cout<<"Quarter "<<i+1<<": $"<<s.sales[i];
    }
    std::cout<<"Max Sale: "<<s.max<<std::endl;
    std::cout<<"Min Sale: "<<s.min<<std::endl;
    std::cout<<"Average of sales: "<<s.average<<std::endl;
}

Main.cpp

#include<iostream>
#include"header.h"

using SALES::Sales;
using SALES::setSales;
using SALES::showSales;

int main()
{
    double Sales1[4] = {453.50, 654.60, 340.20, 500.30};

    Sales Year1;
    Sales Year2;

    setSales(Year1, Sales1, 3);
    setSales(Year2);

    showSales(Year1);
    showSales(Year2);

    return 0;
}

Error

1>------ Build started: Project: Myfirst, Configuration: Debug Win32 ------
1>  Main.cpp
1>Main.obj : error LNK2019: unresolved external symbol "void __cdecl SALES::setSales(struct SALES::Sales &,double const * const,int)" (?setSales@SALES@@YAXAAUSales@1@QBNH@Z) referenced in function _main
1>Main.obj : error LNK2019: unresolved external symbol "void __cdecl SALES::setSales(struct SALES::Sales &)" (?setSales@SALES@@YAXAAUSales@1@@Z) referenced in function _main
1>Main.obj : error LNK2019: unresolved external symbol "void __cdecl SALES::showSales(struct SALES::Sales const &)" (?showSales@SALES@@YAXABUSales@1@@Z) referenced in function _main
1>E:\Documents\Uni\Programming\C++ starter projects\Myfirst\Debug\Myfirst.exe : fatal error LNK1120: 3 unresolved externals
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

Any help would be great, thanks.


Solution

  • When you define the setSales etc functions, you need to tell the compiler that they are in the SALES namespace. Putting

    namespace SALES
    {
    
        // functions here
    }
    

    will do it.