Noel Behailu
Noel Behailu

Reputation: 11

Undefined symbols for architecture x86_64 reference linker error

So I've run into this compiling error when I put the following:

bash-3.2$ g++ -o a *.cpp

Undefined symbols for architecture x86_64: "set_function::set_function(int)", referenced from: _main in ccezs7Gk.o ld: symbol(s) not found for architecture x86_64 collect2: ld returned 1 exit status

but it seems as though everything is right in my files as far as referencing. Maybe I'm missing something?

//
//  hw1_sets.cpp
//
//

#include <iostream>
#include <vector>
#include "hw1.h"

using namespace std;

void set_function::assign()                                        //Assign function
{
    cin >> set_function::sets;
    cout << set_function::sets << endl;
    int i;
    if(sets == "R")                                    //if user inputs R
    {

        for(i=0; i<13; i++)                                       //for loop inputting number into R set
        {
            cin >> R[i];
//            return R[i];
        }

    }
    else if (sets == "S")                             //if user inputs S
    {
        for(i=0; i<13; i++)                                     //for loop inputting number into S set
        {
            cin >> S[i];
//            return S[i];
        }
    }
    else if (sets == "T")                                          //if user inputs T
    {
        for(i=0; i<13; i++)                                     //for loop inputting number into T set
        {
            cin >> T[i];
//            return T[i];
        }
    }
    else
    {
        cout << "This set does not exist! Try again!" << endl;
    }

    cout << " set complete" << endl;
    };

void set_function::clear()                                          //Clear function
{
    //find set

    /*cin >> set_function::set;
     cout << set_function::set << endl;
     int i;
     if(set == set_function::R)
     {
        for(i=0; i<13; i++)
        {
            //clear R values
        }
     }
     else if (set == set_function.S)
     {
        for(i=0; i<13; i++)
        {
            //clear S values
        }
     }
     else if (set == T)
     {
        for(i=0; i<13; i++)
        {
            //clear T values
        }
     }

    //remove all values*/
}

void set_function::unionn()                                         //Union function
{
    //for loop from 0 to 12 (through all elements)
    //if set1[x] or set2[x] = 1
        //solution[x]=1
    //else
        //solution[x]=0

}
void set_function::intersection()                                   //Intersection function
{
    //for loop from 0 to 12 (through all elements)
    //if set1[x] == set2[x]
        //solution[x]=set1[x]
    //else
        //solution[x]=0
}

void set_function::difference()                                     //difference function
{
    //for loop from 0 to 12 (through all elements)
        //set1[x]-set2[x]=solution[x]
}



/*printing the set doesn't work*/
void set_function::print()                                          //print function
{
    /*string setname;
    cin >> setname;
    if (setname = "R")
    {
        for(int i = 0; i<13; i++)
        {
            cout<< R[i] << "-";
        }
        cout << endl;
    }
    else if (setname = "S")
    {
        for(int i = 0; i<13; i++)
        {
            cout<< S[i] << "-";
        }
        cout << endl;
    }
    else if (setname = "T")
    {
        for(int i = 0; i<13; i++)
        {
            cout<< T[i] << "-";
        }
        cout << endl;
    }

    //else if lastdigit
        //end of command or newline*/
}

//exit

//
//  hw1.cpp
//  
//
//
//

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


using namespace std;

int main()
{
    string function;
    set_function sets(27);

    while(1)
    {
        cout << "sets> ";

        cin >> function;

        if(function=="assign")
        {
            sets->assign();
        }
        else if(function=="clear")
        {
            sets->clear();
        }
        else if(function=="union")
        {
            sets->unionn();
        }
        else if(function=="intersection")
        {
            sets->intersection();
        }
        else if(function=="difference")
        {
            sets->difference();
        }
        else if(function=="print")
        {
            sets->print();
        }
        else if(function=="quit")
        {
//            sets->quit();
            return 0;
        }

        else
        {
            cout<<"error"<<endl;
        }
    }
}

//
//  hw1.h
//  
//
//
//

#include <iostream>

using namespace std;

class set_function
{    
    private:
        bool R[13];
        bool S[13];
        bool T[13];

    public:
        string sets;
        int values[13];
        /*void r()
        {
            R.resize(13);
        }
        void s()
        {
            S.resize(13);
        }
        void t()
        {
            T.resize(13);
        }*/
        set_function(int a){}
        void assign();
        void clear();
        void unionn();
        void intersection();
        void difference();
        void print();
//        void quit();

};

edit (10/3/13 @12:50p): I changed what was commented on and now I get this problem:

hw1.cpp: In function ‘int main()’:
hw1.cpp:28: error: base operand of ‘->’ has non-pointer type ‘set_function’
hw1.cpp:32: error: base operand of ‘->’ has non-pointer type ‘set_function’
hw1.cpp:36: error: base operand of ‘->’ has non-pointer type ‘set_function’
hw1.cpp:40: error: base operand of ‘->’ has non-pointer type ‘set_function’
hw1.cpp:44: error: base operand of ‘->’ has non-pointer type ‘set_function’
hw1.cpp:48: error: base operand of ‘->’ has non-pointer type ‘set_function’

edit (10/3/13 @1:23p): Fixed. changed the following:

set_function *sets = new set_function(27)

to

set_function *sets;
sets = new set_function(27);

compiles correctly now. Thanks!

Upvotes: 0

Views: 7271

Answers (2)

Jack
Jack

Reputation: 133609

So you declare set_function::set_function(int a) in hw1.h. Then main.cpp is correctly compiled as the call to the constructor of set_function is correct as found declared in the header file hw1.h.

But that function is not implemented anywhere, linking occurs and the call is not resolved.

You should implement it right in the header file or in hw1.cpp file.

Upvotes: 1

Carl Norum
Carl Norum

Reputation: 225082

That's not a compiler error, it's a linker error. You're getting it because you declared a constructor for your set_function class but didn't ever define it.

Upvotes: 3

Related Questions