GCC 4.8 on Mac OS X v10.8 throws "Undefined symbols for architecture x86_64"

Gcc

Gcc Problem Overview


I write code like this in my Mac OS X v10.8 (Mountain Lion), and when I use "gcc use_new.cpp -o use_new" to compile it, it throws a wrong message like this:

Undefined symbols for architecture x86_64:
  "std::basic_ostream<char, std::char_traits<char> >::operator<<(std::basic_ostream<char, std::char_traits<char> >& (*)(std::basic_ostream<char, std::char_traits<char> >&))", referenced from:
      _main in ccr2vrRQ.o
  "std::basic_ostream<char, std::char_traits<char> >::operator<<(void const*)", referenced from:
      _main in ccr2vrRQ.o
  "std::basic_ostream<char, std::char_traits<char> >::operator<<(double)", referenced from:
      _main in ccr2vrRQ.o
  "std::basic_ostream<char, std::char_traits<char> >::operator<<(int)", referenced from:
      _main in ccr2vrRQ.o
  "std::basic_ostream<char, std::char_traits<char> >::operator<<(unsigned long)", referenced from:
      _main in ccr2vrRQ.o
  "std::ios_base::Init::Init()", referenced from:
      __static_initialization_and_destruction_0(int, int) in ccr2vrRQ.o
  "std::ios_base::Init::~Init()", referenced from:
      __static_initialization_and_destruction_0(int, int) in ccr2vrRQ.o
  "std::cout", referenced from:
      _main in ccr2vrRQ.o
  "std::basic_ostream<char, std::char_traits<char> >& std::endl<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&)", referenced from:
      _main in ccr2vrRQ.o
  "std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)", referenced from:
      _main in ccr2vrRQ.o
  "operator delete(void*)", referenced from:
      _main in ccr2vrRQ.o
  "operator new(unsigned long)", referenced from:
      _main in ccr2vrRQ.o
ld: symbol(s) not found for architecture x86_64
collect2: error: ld returned 1 exit status

And when I use "g++ use_new.cpp -o use_new" it is OK. How can I fix this?

#include <iostream>

struct fish
{
    float weight;
    int id;
    int kind;
};

int main()
{
    using namespace std;
    int* pt = new int;
    *pt = 1001;
    cout << "int: " << *pt << "in location: " << pt << endl;
    double* pd = new double;
    *pd = 100000001.0;
    cout << "double: " << *pd << "in location: " << pd << endl;
    cout << "int point pt is length " << sizeof(*pt) << endl;
    cout << "double point pd is length " << sizeof(*pd) << endl;
    delete pt;
    delete pd;
    cout << (int *)"How are you!" << endl;
    return 0;
}

Gcc Solutions


Solution 1 - Gcc

This is the case even with the old 4.2 GCC (I experienced this when I set up my unofficial iOS toolchain). gcc assumes C by default, and invokes the linker without linking to the C++ standard library; in contrast, g++ assumes C++ and links against the C++ standard library by default.

All in all - possible solutions:

gcc myprog.c -o myprog -lstdc++

or

g++ myprog.c -o myprog

Solution 2 - Gcc

The answer to this Stack Overflow question has the answer

https://stackoverflow.com/questions/5228154/gcc-and-g-linker

Use

gcc -lstdc++ use_new.cpp -o use_new

The -lstdc++ flag tells the linker to include the C++ Standard Library.

I'm running Mac OS X v10.7.4 (Lion) and the library is located here:

/usr/lib/libstdc++.dylib

Solution 3 - Gcc

This isn't related to the code pasted by @user1582840, just my two cents, and from a different cause of the same problem in g++ when working on some of my own code:

I received the "ld: symbol(s) not found for architecture x86_64" error when using g++ 4.2.1 on OS X v10.8 (Mountain Lion)/Darwin 11 for a different reason.

I received this error because I had a Class defined. In the class definition, I declared member functions. However, when I defined the member functions I forgot to include the class modifier.

So for an example of what I'm talking about (code sample, not full program):

class NewClass
{
    NewClass(); // Default constructor
};

Then later, when defining the NewClass() constructor (or any member function) I simply had:

// Don't do this. It will throw that error!!
NewClass()
{
    // Do whatever
}

rather than:

// Proper way
NewClass::NewClass()
{
    // Do whatever
}

This is a rather simple mistake, and I managed to catch it in a short amount of time luckily, but it could be easy for someone to miss (us newbies especially), and the solutions about gcc/g++ linkers, Xcode, etc. aren't any help for this :P

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questionuser1582840View Question on Stackoverflow
Solution 1 - Gccuser529758View Answer on Stackoverflow
Solution 2 - GccamdnView Answer on Stackoverflow
Solution 3 - Gccuser3064209View Answer on Stackoverflow