it-swarm.com.de

Fehler beim Kompilieren eines einfachen C++ - Codes

Ich versuche, diesen CPP-Code auf osx lion zu kompilieren, aber ich erhalte eine Fehlermeldung.

#include <iostream> 

using namespace std; 

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

    return 0; 
}

Kompilieren:

cc main.cpp

Error:

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
42

Normalerweise tritt diese Art von Fehler auf, wenn Sie Ihren C++ - Code durch Aufrufen des C-Frontends kompilieren. Die gcc, die Sie ausführen, versteht und kompiliert die Datei als C++, verknüpft sie jedoch nicht mit den C++ - Bibliotheken. Beispiel:

$ 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 
$ 

Wie Sie sehen, werden mit g++ die Probleme beseitigt. Das gleiche Verhalten (mit etwas anderen Meldungen) tritt auf, wenn Sie clang verwenden (was ich empfehlen würde):

$ 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 
$

Wie Sie in der clang-Fehlermeldung sehen können, können Sie -v verwenden, um den Linker-Aufruf anzuzeigen, um zu sehen, was schief läuft. Es würde Ihnen diese Linkzeile zeigen:

"/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

Oder etwas ähnliches - wie Sie sehen, ist es eine Verknüpfung der C-Laufzeit, nicht von C++, und auch nicht über die C++ - Bibliotheken. Bei Verwendung von clang++ lautet die Linkzeile:

"/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

Wie Sie sehen, ist libstdc++ enthalten, und es werden keine Verbindungsfehler angezeigt.

88
Carl Norum

Versuchen 

g++ main.cpp

Auf diese Weise sollte es zumindest unter OS X funktionieren

5
Allisone

Ich bin mit OSX LION nicht vertraut. Im engsten Sinne werden die beschriebenen Fehler jedoch nicht vom Compiler, sondern vom Linker verursacht. Es scheint, als würde die Standardbibliothek nicht verlinkt.

3
S.C. Madsen

Verwenden Sie den CC-Befehl (Großbuchstaben), um C++ zu kompilieren und eine Verknüpfung zur Standard-C++ - Bibliothek herzustellen.

3
AndrzejJ

Wenn Sie unter OS X Clang verwenden, versuchen Sie Folgendes:

clang++ simple_cpp_program_file.cpp -o simple_cpp_program_file.out
1
2324

Hier ist die Lösung, die auf macOs Sierra funktioniert:

Unter OS X sind zwei Implementierungen der Standard-C++ - Bibliothek verfügbar: libstdc ++ und libc ++. Sie sind nicht binärkompatibel und libMLi3 erfordert libstdc ++.

In Version 10.8 und früher wird libstdc ++ standardmäßig ausgewählt. In Version 10.9 wird libc ++ standardmäßig ausgewählt. Um die Kompatibilität mit libMLi3 sicherzustellen, müssen Sie libstdc ++ manuell auswählen.

Fügen Sie dem Verbindungsbefehl dazu -stdlib = libstdc ++ hinzu.

1
user1031613

Seit Yosemite (10.10.1) habe ich festgestellt, dass auch gcc mit dem -lc++-Flag funktioniert:

gcc -lc++ main.cpp
1

Ist das GCC unter Windows (MinGW) oder Linux? Bei MinGW benötigen Sie die Parameter -lmingw32 -enable-auto-import. Linux benötigt möglicherweise etwas Ähnliches, -enable-auto-import wird höchstwahrscheinlich benötigt.

0
Frigo

In der für -lstdc ++ nicht gefundenen Fehlerbibliothek ld: library liegt also der eigentliche Fehler.

Öffnen Sie den Ordner, um das Problem zu beheben

öffnen Sie/Library/Developer/CommandLineTools/Packages /

Führen Sie das Paket macOS_SDK_headers_for_macOS_10.14.pkg aus

Dann funktioniert gem install mini_racer!

Dieses Problem hängt möglicherweise nicht nur mit mini_racer zusammen, da es sich auf alle Edelsteine ​​auswirken kann, die eine Erweiterung kompilieren.

0
wangqingtao