Ошибка при компиляции простого кода на C ++ - PullRequest
42 голосов
/ 23 сентября 2011

Я пытаюсь скомпилировать этот код cpp на osx lion, но получаю ошибку.

#include <iostream> 

using namespace std; 

int main (int argc, char *argv[]) 
{ 
    for(int i = 0; i < 10; i++) 
    { 
        cout << "hi"; 
        cout << endl; 
    } 

    return 0; 
}

Для компиляции:

cc main.cpp

Ошибка:

Undefined symbols for architecture x86_64:
  "std::cout", referenced from:
      _main in ccBdbc76.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 ccBdbc76.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 ccBdbc76.o
  "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 ccBdbc76.o
  "std::ios_base::Init::Init()", referenced from:
      __static_initialization_and_destruction_0(int, int)in ccBdbc76.o
  "std::ios_base::Init::~Init()", referenced from:
      ___tcf_0 in ccBdbc76.o
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status

Ответы [ 8 ]

89 голосов
/ 23 сентября 2011

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

$ gcc example.cpp 
Undefined symbols for architecture x86_64:
  "std::cout", referenced from:
      _main in ccLTUBHJ.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 ccLTUBHJ.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 ccLTUBHJ.o
  "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 ccLTUBHJ.o
  "std::ios_base::Init::Init()", referenced from:
      __static_initialization_and_destruction_0(int, int)in ccLTUBHJ.o
  "std::ios_base::Init::~Init()", referenced from:
      ___tcf_0 in ccLTUBHJ.o
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status
$ g++ example.cpp 
$ 

Как видите, использование g++ устраняет проблемы.Такое же поведение (с немного другими сообщениями) происходит, если вы используете clang (что я бы порекомендовал):

$ clang example.cpp 
Undefined symbols for architecture x86_64:
  "std::ios_base::Init::~Init()", referenced from:
      ___cxx_global_var_init in cc-IeV9O1.o
  "std::ios_base::Init::Init()", referenced from:
      ___cxx_global_var_init in cc-IeV9O1.o
  "std::cout", referenced from:
      _main in cc-IeV9O1.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 cc-IeV9O1.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 cc-IeV9O1.o
  "std::ostream::operator<<(std::ostream& (*)(std::ostream&))", referenced from:
      _main in cc-IeV9O1.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
$ clang++ example.cpp 
$

Как вы можете видеть в сообщении об ошибке clang, вы можете использовать -v чтобы увидеть вызов компоновщика, чтобы увидеть, что происходит не так.Он покажет вам эту строку:

"/usr/bin/ld" -demangle -dynamic -arch x86_64 
    -macosx_version_min 10.6.8 -o a.out -lcrt1.10.6.o
    /var/folders/zl/zlZcj24WHvenScwjPFFFQE+++TI/-Tmp-/cc-hdOL8Z.o
    -lSystem /Developer/usr/bin/../lib/clang/3.0/lib/darwin/libclang_rt.osx.a

Или что-то в этом роде - как вы можете видеть, он связывает среду выполнения C, а не C ++, и также не имеет библиотек C ++.При использовании clang++ линия связи:

"/usr/bin/ld" -demangle -dynamic -arch x86_64
     -macosx_version_min 10.6.8 -o a.out -lcrt1.10.6.o 
     /var/folders/zl/zlZcj24WHvenScwjPFFFQE+++TI/-Tmp-/cc-wJwxjP.o 
     /usr/lib/libstdc++.6.dylib -lSystem
     /Developer/usr/bin/../lib/clang/3.0/lib/darwin/libclang_rt.osx.a

Как вы можете видеть, libstdc++ включена, а presto - без ошибок связи.

5 голосов
/ 24 сентября 2012

Попробуйте

g++ main.cpp

Таким образом, он должен работать, по крайней мере, с использованием OS X

3 голосов
/ 23 сентября 2011

Используйте команду CC (в верхнем регистре) для компиляции C ++ и ссылки на стандартную библиотеку C ++.

3 голосов
/ 23 сентября 2011

Я не знаком с OSX LION.Однако в самом строгом смысле описанные ошибки вызваны не компилятором, а компоновщиком.Кажется, что стандартная библиотека не связана.

1 голос
/ 07 апреля 2017

Вот решение, которое работает на macOs Sierra:

В OS X доступны две реализации стандартной библиотеки C ++: libstdc ++ и libc ++.Они не являются бинарно-совместимыми, и libMLi3 требует libstdc ++.

На 10.8 и более ранних версиях libstdc ++ выбран по умолчанию, на 10.9 libc ++ выбран по умолчанию.Чтобы обеспечить совместимость с libMLi3, нам нужно выбрать libstdc ++ вручную.

Чтобы сделать это, добавьте -stdlib = libstdc ++ к команде компоновки.

1 голос
/ 14 декабря 2016

Если вы используете clang в OS X, попробуйте:

clang++ simple_cpp_program_file.cpp -o simple_cpp_program_file.out
1 голос
/ 29 ноября 2014

Начиная с Yosemite (10.10.1), я обнаружил, что gcc с флагом -lc++ также работает:

gcc -lc++ main.cpp
0 голосов
/ 23 сентября 2011

Это GCC в Windows (MinGW) или Linux?На MinGW вам нужны параметры -lmingw32 -enable-auto-import.Linux может понадобиться что-то похожее, скорее всего, потребуется -enable-auto-import.

...