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

Ошибка при компиляции некоторого простого кода С++

Я пытаюсь скомпилировать этот код 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
4b9b3361

Ответ 1

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

$ 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 runtime, а не С++, а также не имеет библиотек С++. Используя 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 - отсутствие ошибок ссылок.

Ответ 2

Попробуйте

g++ main.cpp

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

Ответ 3

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

Ответ 4

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

Ответ 5

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

gcc -lc++ main.cpp

Ответ 6

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

clang++ simple_cpp_program_file.cpp -o simple_cpp_program_file.out

Ответ 7

Здесь решение, которое работает на macOs Sierra:

В OS X реализованы две версии стандартной библиотеки С++: libstdС++ и libС++. Они не совместимы с двоичными файлами, а libMLi3 требует libstdС++.

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

Чтобы сделать это, добавьте -stdlib = libstdС++ к команде связывания.

Ответ 8

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

Ответ 9

Таким образом, ошибка ld: library не найдена для -lstdc ++, и именно здесь кроется настоящая ошибка.

Чтобы это исправить, откройте папку

open/Library/Разработчик /CommandLineTools/Пакеты/

Запустите пакет macOS_SDK_headers_for_macOS_10.14.pkg

Тогда gem install mini_racer работает!

Эта проблема может быть связана не только с mini_racer, так как она может повлиять на любой гем, который компилирует расширение.