eclipse c++ build error Undefined symbols for architecture x86_64: ld: symbol(s) not found for architecture x86_64

StackOverflow https://stackoverflow.com/questions/16410694

  •  14-04-2022
  •  | 
  •  

Question

Sorry I'm very new to this and am hoping anyone can give a bit of direction. I am taking a data structures class and learning C++. We're using eclipse and am having problems building some code straight out of the textbook. I am on Eclipse 3.5.2 running on Mac OSX 10.7.5 on a macbook pro.

I have the following files:

List.h

// List.h
#ifndef _LIST_H_
#define _LIST_H_

#include <cstdlib>

class List {

public:
  List(size_t capacity=10); // constructor - allocates dynamic array
  List(const List &a); // copy constructor
  ~List(); // destructor

  int& operator[](size_t pos); // bracket operator
  List& operator=(const List &a); // assignment operator
  List& operator+=(const List &a); // += operator

  void append(int item);
  size_t size() const { return size_; }

private:
  void copy(const List &a);
  void resize(size_t new_size); // allocate new larger array
  int *data_; // dynamic array
  size_t size_; // size of dynamic array
  size_t capacity_; // capacity of dynamic array
};

inline int& List::operator[](size_t pos)
{
  return data_[pos];
}

#endif // _LIST_H_

List.cpp

// List.cpp
#include "List.h"

List::List(size_t capacity)
{
  data_ = new int[capacity];
  capacity_ = capacity;
  size_ = 0;
}

List::List(const List &list)
{
  copy(list);
}

List::~List()
{
  delete [] data_;
}

void List::copy(const List &list)
{
  size_t i;

  size_ = list.size_;
  capacity_ = list.capacity_;
  data_ = new int[list.capacity_];
  for (i=0; i<list.capacity_; ++i) {
    data_[i] = list.data_[i];
  }
}

List& List::operator=(const List &list)
{
  if (&list != this) {
    // deallocate existing dynamic array
    delete [] data_;
    // copy the data
    copy(list);
  }
  return *this;
}

List& List::operator+=(const List &list)
{
  size_t i;
  size_t pos = size_;

  if ((size_ + list.size_) > capacity_) {
    resize(size_ + list.size_);
  }

  for (i=0; i<list.size_; ++i) {
    data_[pos++] = list.data_[i];
  }
  size_ += list.size_;
  return *this;
}

void List::append(int item)
{
  if (size_ == capacity_) {
    resize(2 * capacity_);
  }
  data_[size_++] = item;
}

// should this method have a precondition? see end of chapter exercises
void List::resize(size_t new_size)
{
  int *temp;
  size_t i;

  capacity_ = new_size;
  temp = new int[capacity_];
  for (i=0; i<size_; ++i) {
    temp[i] = data_[i];
  }
  delete [] data_;
  data_ = temp;
}

The following appears in the console after I build:

**** Build of configuration Debug for project CList ****

make all 
Building file: ../List.cpp
Invoking: GCC C++ Compiler
g++ -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"List.d" -MT"List.d" -o"List.o" "../List.cpp"
Finished building: ../List.cpp

Building target: CList
Invoking: MacOS X C++ Linker
g++  -o "CList"  ./List.o   
Undefined symbols for architecture x86_64:
  "_main", referenced from:
      start in crt1.10.6.o
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status
make: *** [CList] Error 1

Thanks in advance.

Was it helpful?

Solution

The program must contain function main. Add it to existing .cpp file or add new .cpp file to the project, something like this:

int main(int argc, char** argv)
{
    // use List class here
    return 0;
}

Function main is the program start point. Linker expects this function to be defined in one of source files.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top