3

i get this error when i try and compile my C++ code on Mac. I've been programming for a while on PC but just got given a Mac laptop for UNI work and I'm getting used to it. I usually compile using "gcc" but it seems to not work. Any help would be appreciated. Until then ill just use "clang++" when compiling.

Alternatively, If i use "gcc" to compile and there are ERRORS in the code, it works perfectly. This only happens when there are NO ERRORS.

Michaels-MacBook-Pro:C++ Michael$ cc HelloWorld.cpp 
Undefined symbols for architecture x86_64:
  "std::__1::locale::use_facet(std::__1::locale::id&) const", referenced from:
      std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::__put_character_sequence<char, std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, char const*, unsigned long) in HelloWorld-97feed.o
  "std::__1::ios_base::getloc() const", referenced from:
      std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::__put_character_sequence<char, std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, char const*, unsigned long) in HelloWorld-97feed.o
  "std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::__init(unsigned long, char)", referenced from:
      std::__1::ostreambuf_iterator<char, std::__1::char_traits<char> > std::__1::__pad_and_output<char, std::__1::char_traits<char> >(std::__1::ostreambuf_iterator<char, std::__1::char_traits<char> >, char const*, char const*, char const*, std::__1::ios_base&, char) in HelloWorld-97feed.o
  "std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::~basic_string()", referenced from:
      std::__1::ostreambuf_iterator<char, std::__1::char_traits<char> > std::__1::__pad_and_output<char, std::__1::char_traits<char> >(std::__1::ostreambuf_iterator<char, std::__1::char_traits<char> >, char const*, char const*, char const*, std::__1::ios_base&, char) in HelloWorld-97feed.o
  "std::__1::basic_ostream<char, std::__1::char_traits<char> >::sentry::sentry(std::__1::basic_ostream<char, std::__1::char_traits<char> >&)", referenced from:
      std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::__put_character_sequence<char, std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, char const*, unsigned long) in HelloWorld-97feed.o
  "std::__1::basic_ostream<char, std::__1::char_traits<char> >::sentry::~sentry()", referenced from:
      std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::__put_character_sequence<char, std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, char const*, unsigned long) in HelloWorld-97feed.o
  "std::__1::cout", referenced from:
      _main in HelloWorld-97feed.o
  "std::__1::ctype<char>::id", referenced from:
      std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::__put_character_sequence<char, std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, char const*, unsigned long) in HelloWorld-97feed.o
  "std::__1::locale::~locale()", referenced from:
      std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::__put_character_sequence<char, std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, char const*, unsigned long) in HelloWorld-97feed.o
  "std::__1::ios_base::__set_badbit_and_consider_rethrow()", referenced from:
      std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::__put_character_sequence<char, std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, char const*, unsigned long) in HelloWorld-97feed.o
  "std::__1::ios_base::clear(unsigned int)", referenced from:
      std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::__put_character_sequence<char, std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, char const*, unsigned long) in HelloWorld-97feed.o
  "std::terminate()", referenced from:
      ___clang_call_terminate in HelloWorld-97feed.o
  "___cxa_begin_catch", referenced from:
      std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::__put_character_sequence<char, std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, char const*, unsigned long) in HelloWorld-97feed.o
      ___clang_call_terminate in HelloWorld-97feed.o
  "___cxa_end_catch", referenced from:
      std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::__put_character_sequence<char, std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, char const*, unsigned long) in HelloWorld-97feed.o
  "___gxx_personality_v0", referenced from:
      std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::__put_character_sequence<char, std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, char const*, unsigned long) in HelloWorld-97feed.o
      std::__1::ostreambuf_iterator<char, std::__1::char_traits<char> > std::__1::__pad_and_output<char, std::__1::char_traits<char> >(std::__1::ostreambuf_iterator<char, std::__1::char_traits<char> >, char const*, char const*, char const*, std::__1::ios_base&, char) in HelloWorld-97feed.o
      Dwarf Exception Unwind Info (__eh_frame) in HelloWorld-97feed.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
chema989
  • 3,962
  • 2
  • 20
  • 33

2 Answers2

4

gcc, clang and cc (which appears to be a symlink to clang on your system) are commands to build C programs.

g++ and clang++ are commands to build C++ programs.

C and C++ are two different languages.

And although all those commands are typically just "front doors" to a bigger compiler behind the scenes that is capable of building all sorts of stuff, there are certain defaults that depend on the actual command you entered. For example, executing gcc or cc will not automatically add the C++ standard library to the libraries being linked into your program.

Read the documentation and then use the correct command to build C++ programs in your toolchain. For Clang, that's clang++ (as you've discovered). For GCC, that's g++.

Community
  • 1
  • 1
Lightness Races in Orbit
  • 378,754
  • 76
  • 643
  • 1,055
2

In previous versions of Xcode, apple used to ship both libstdc++ and libc++. In order to prevent name-clashes, the maintainers of libc++ alias the std:: namespace to std::__1.

What is happening is that g++ (which defaults to using libstdc++) is linking against libraries that have been compiled with clang (which defaults to libc++)

In fact, stdlibc++ is still shipped with Xcode but as far as I can tell it's out of date.

confused?

So was I.

Unless you know exactly what you're doing, it's best to compile everything with clang++ on a mac. In fact, later versions of Xcode treat g++ as a synonym for clang++.

Richard Hodges
  • 68,278
  • 7
  • 90
  • 142