Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

LNK2019 error c++ unresolved external symbol

Tags:

c++

Ive got these error messages:

Error 1 error LNK2019: unresolved external symbol "public: void __thiscall ArrayIntStorage::sortOwn(void)" (?sortOwn@ArrayIntStorage@@QAEXXZ) referenced in function _main G:\08227\ACW\MAIN\08227_ACW2_Test_Harnesses_2010-11\C_Style_Array\main.obj C_Style_Array

Error 2 error LNK2019: unresolved external symbol "public: void __thiscall ArrayIntStorage::sortStd(void)" (?sortStd@ArrayIntStorage@@QAEXXZ) referenced in function _main G:\08227\ACW\MAIN\08227_ACW2_Test_Harnesses_2010-11\C_Style_Array\main.obj C_Style_Array

Error 3 error LNK2019: unresolved external symbol "class std::basic_ostream > & __cdecl operator<<(class std::basic_ostream > &,class ArrayIntStorage const &)" (??6@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@std@@AAV01@ABVArrayIntStorage@@@Z) referenced in function _main G:\08227\ACW\MAIN\08227_ACW2_Test_Harnesses_2010-11\C_Style_Array\main.obj C_Style_Array

Error 4 error LNK2019: unresolved external symbol "class std::basic_istream > & __cdecl operator>>(class std::basic_istream > &,class ArrayIntStorage &)" (??5@YAAAV?$basic_istream@DU?$char_traits@D@std@@@std@@AAV01@AAVArrayIntStorage@@@Z) referenced in function _main G:\08227\ACW\MAIN\08227_ACW2_Test_Harnesses_2010-11\C_Style_Array\main.obj C_Style_Array

Error 5 error LNK2019: unresolved external symbol "public: bool __thiscall ArrayIntStorage::setReadSort(bool)" (?setReadSort@ArrayIntStorage@@QAE_N_N@Z) referenced in function _main G:\08227\ACW\MAIN\08227_ACW2_Test_Harnesses_2010-11\C_Style_Array\main.obj C_Style_Array

Error 6 error LNK1120: 5 unresolved externals G:\08227\ACW\MAIN\08227_ACW2_Test_Harnesses_2010-11\C_Style_Array\Debug\C_Style_Array.exe 1 1 C_Style_Array

and I dont know whats going on, I wonder if ive missed something? I am new to this and Its not giving me any line numbers so Im not sure which code to give you so Ill give you this part

#include <fstream>
#include <iostream>
using namespace std;
#include "ArrayIntStorage.h"

int main(int argc, char **argv) {

ifstream fin1("ACW2_data.txt");
ofstream out1("1-arrayUnsortedRead.txt");
ofstream out2("2-arrayUnsortedRead-thenSTDSort.txt");

if(!fin1.is_open()) 
{
    cout << "FAIL" << endl;
    return 1;
}

ArrayIntStorage arrayStorage1;
arrayStorage1.setReadSort(false);   // do not read sort

// read in int values into data structure
fin1 >> arrayStorage1;

// output int values in data structure to file
out1 << arrayStorage1;

// sort data structure using std
arrayStorage1.sortStd();

// output int values in data structure to file
out2 << arrayStorage1;

fin1.close();
out1.close();
out2.close();
like image 426
tanya Avatar asked Apr 20 '11 12:04

tanya


3 Answers

Your linker (part of the compiler) cannot find where ArrayIntStorage::sortOwn() is defined.

This usually occurs either:

  1. The definition of ArrayIntStorage::sortOwn() is in another .c file which you forgot to tell the compiler about (and so wasn't compiled),
  2. ArrayIntStorage is a header only library (so there is no other .c file), in which case you probably have forgotten to implement the function sortOwn(), and have only declaired it.
  3. ArrayIntStorage is an external library which has not been linked. (as Tomalak Geretkal Notes, and is solved by following the steps set out by paxdiablo)

If its neither of these, or you find these options confusing, please post the header file ArrayIntStorage.h and the corresponding .c file (should there be one).

like image 131
Tom Avatar answered Sep 25 '22 17:09

Tom


This is a linker error and can be easily resolved once you understand the process.

By #include-ing the header file in your source code, that lets the compiler know about the definitions it requires.

However, there's an extra step needed. You have to link all the various object files and libraries together.

That's because, while the header contains information about the ArrayIntStorage stuff, the actual code for it is elsewhere. That's what's bought in at the link stage.

Basically, you need to ensure that the object file or library is included in your build process.

For example, the following gcc command will include the abc.o object module and bring in anything needed from the libxyz.a archive library:

gcc -o myprog myprog.c abc.o -L/path/to/libs -lxyz

It may also be done differently for different environments. For example, an IDE will most likely have it under project settings of some sort.

This answer provides some more information of the compiling and linking processes common in a lot of environments.

like image 26
paxdiablo Avatar answered Sep 24 '22 17:09

paxdiablo


You forgot to link the library where ArrayIntStorage's functions are defined. Read the documentation for that library to find out how to use it in your project.

like image 25
Lightness Races in Orbit Avatar answered Sep 22 '22 17:09

Lightness Races in Orbit