Подтвердить что ты не робот

gcc 4.8 на MAC OS X 10.8 throws "Неопределенные символы для архитектуры x86_64:"

все, я пишу код, подобный этому в моем mac os x 10.8, и когда я использую "gcc use_new.cpp -o use_new" для его компиляции, но он вызывает неправильное сообщение:

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

и когда я использую "g++ use_new.cpp -o use_new" в порядке, кто может мне помочь !? Спасибо!

#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;
  }
4b9b3361

Ответ 1

Это имеет место даже со старым 4.2 GCC (я испытал это, когда установил свою неофициальную инструментальную цепочку iOS). gcc принимает C по умолчанию и вызывает компоновщик без ссылки на стандартную библиотеку C++; напротив, g++ предполагает C++ и ссылки на стандартную библиотеку C++ по умолчанию.

В целом - возможные решения:

gcc myprog.c -o myprog -lstdc++

или

g++ myprog.c -o myprog

Ответ 2

Ответ на этот вопрос stackoverflow имеет ответ

gcc и g++ компоновщик

использование

gcc -lstdc++ use_new.cpp -o use_new

-lstdC++ указывает компоновщику включить стандартную библиотеку C++

http://en.wikipedia.org/wiki/C%2B%2B_Standard_Library

Я запускаю Mac OS X 10.7.4, и библиотека находится здесь

/usr/lib/libstdc++.dylib

Ответ 3

Это не связано с кодом, вставленным @user1582840, всего за 2 цента, и из-за другой причины той же проблемы в g++ при работе над некоторым из моего собственного кода:

Я получил ошибку "ld: symbol (s) not found for architecture x86_64" при использовании g++ 4.2.1 на OS X 10.8/Darwin11 по другой причине. Надеюсь, это поможет вам найти причину проблемы.

Я получил эту ошибку, потому что у меня был определенный класс, в определении класса я объявлял функции-члены. Однако, когда я определил функции-члены, я забыл включить модификатор класса.

Итак, для примера того, о чем я говорю (образец кода, а не полная программа):

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

то позже при определении конструктора NewClass() (или любой функции-члена) я просто имел:

// don't do this, it will throw that error!!
NewClass()
{
    // do whatever
}

скорее, чем:

// proper way
NewClass::NewClass()
{
    // do whatever
}

Это довольно простая ошибка, и я сумел поймать ее за короткое время, к счастью, но было бы легко пропустить кого-то (особенно мы новичков), а также решения о компоновщиках gcc/g++, XCode и т.д. не помогают: P

Опять же, надеюсь, что это поможет!