Компоновщик GCC не может найти стандартную библиотеку? - PullRequest
5 голосов
/ 18 января 2012

Я занимаюсь разработкой школьного проекта в XCode. Конечный продукт должен быть представлен в исходном коде с make-файлом, поэтому я написал make-файл и начал компиляцию таким образом, чтобы убедиться, что у меня есть рабочая копия. Вот мой make-файл:

all: main.o StackList.o world.o Farm.o
        gcc main.o StackList.o world.o Farm.o -g -o Project1

main.o:
        gcc -g -c main.cpp

StackList.o:
        gcc -g -c Stacklist.cpp

world.cpp:
        gcc -g -c world.cpp

Farm.cpp:
        gcc -g -c Farm.cpp

clean:
        rm *.o Project1

Компиляция каждого из объектных файлов работает нормально, но когда он добирается до «всего», на этапе связывания, он, похоже, не знает о стандартной библиотеке. Я получаю ошибку «неопределенные символы» для всех от «cin» до «basic_string» и «operator new».

У меня сложилось впечатление, что эти вещи не нужно указывать напрямую, и фактически не нужно было делать это в прошлом.

Есть идеи, что может произойти?

EDIT:

Если это поможет, вот начало (очень длинного) сообщения об ошибке:

Undefined symbols for architecture x86_64:
  "std::cin", referenced from:
  _main in main.o
  "std::cout", referenced from:
      _main in main.o
      Farm::print(int)  in Farm.o
  "std::basic_ostream<char, std::char_traits<char> >& std::operator<< <char, std::char_traits<char>, std::allocator<char> >(std::basic_ostream<char, std::char_traits<char> >&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)", referenced from:
      _main in main.o
  "std::ios_base::Init::Init()", referenced from:
      __static_initialization_and_destruction_0(int, int)in main.o
      __static_initialization_and_destruction_0(int, int)in StackList.o
      __static_initialization_and_destruction_0(int, int)in world.o
      __static_initialization_and_destruction_0(int, int)in Farm.o
  "std::ios_base::Init::~Init()", referenced from:
      ___tcf_0 in main.o
      ___tcf_0 in StackList.o
      ___tcf_0 in world.o
      ___tcf_0 in Farm.o
  "operator new(unsigned long)", referenced from:
      doStackSearch(std::basic_istream<char, std::char_traits<char> >*, std::list<Farm*, std::allocator<Farm*> >*&)in world.o

Ответы [ 3 ]

20 голосов
/ 18 января 2012

Чтобы связать код C ++, вам нужно использовать команду g++, а не команду gcc.

При компиляции команда gcc знает, что она компилирует код C ++ из-за .cpp суффикс (но все равно рекомендуется использовать команду g++).

При компоновке команда gcc просто видит группу файлов .o.Команда g++ отличается от команды gcc тем, что она знает, где найти специфичные для C ++ библиотеки.

(Тот факт, что имя gcc относится к команде, которая обычно используетсядля компиляции кода на языке C, и "Коллекция компиляторов GNU" в целом может быть немного запутанной.)

1 голос
/ 18 января 2012

Вам необходимо использовать g++ для компиляции и компоновки исходного кода C ++, а не gcc.

Кроме того, вы можете пропустить все цели, кроме первой и последней. make уже знает, как скомпилировать .cpp файлы в .o - вам не нужно указывать, как.

0 голосов
/ 18 января 2012
    gcc main.o StackList.o world.o Farm.o -g -o Project1

Что, по вашему мнению, в этой командной строке gcc указывает на ссылку в стандартной библиотеке C ++? Нет связанных файлов C ++. Вы не указали язык. И вы вызываете компилятор как gcc.

...