web-dev-qa-db-fra.com

Erreur lors de la compilation de code c ++ simple

J'essaie de compiler ce code cpp sur osx lion mais je reçois une erreur.

#include <iostream> 

using namespace std; 

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

    return 0; 
}

Compiler:

cc main.cpp

Erreur:

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

Normalement, ce type d’échec se produit lors de la compilation de votre code C++ en appelant l’interface C. La gcc que vous exécutez comprend et compile le fichier en tant que C++, mais ne le relie pas aux bibliothèques C++. Exemple:

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

Comme vous pouvez le constater, utiliser g++ fait disparaître les problèmes. Le même comportement (avec des messages légèrement différents) se produit si vous utilisez clang (ce que je recommanderais):

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

Comme vous pouvez le constater dans le message d'erreur clang, vous pouvez utiliser -v pour afficher l'invocation de l'éditeur de liens afin de voir ce qui ne va pas. Cela vous montrerait cette ligne de lien:

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

Ou quelque chose comme ça - comme vous pouvez le voir, cela relie le runtime C, pas le C++, et n'a pas non plus les bibliothèques C++. En utilisant clang++ la ligne de lien est:

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

Comme vous pouvez le constater, libstdc++ est inclus et presto: pas d’erreurs de lien.

88
Carl Norum

Essayer 

g++ main.cpp

De cette façon, cela devrait fonctionner, au moins avec OS X

5
Allisone

Je ne connais pas OSX LION. Cependant, au sens le plus strict, les erreurs décrites ne sont pas causées par le compilateur, mais par l'éditeur de liens. Il semble que la bibliothèque standard ne soit pas liée.

3
S.C. Madsen

Utilisez la commande CC (majuscule) pour compiler C++ et vous connecter à la bibliothèque C++ standard.

3
AndrzejJ

Si vous utilisez Clang sous OS X, essayez:

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

Voici la solution qui fonctionne sur macOs Sierra:

Il existe deux implémentations de la bibliothèque standard C++ disponibles sur OS X: libstdc ++ et libc ++. Ils ne sont pas compatibles binaires et libMLi3 nécessite libstdc ++.

À partir de 10.8, libstdc ++ est choisi par défaut, à 10.9, libc ++ est choisi par défaut. Pour assurer la compatibilité avec libMLi3, nous devons choisir manuellement libstdc ++.

Pour ce faire, ajoutez -stdlib = libstdc ++ à la commande de liaison.

1
user1031613

Depuis Yosemite (10.10.1), j'ai trouvé que gcc avec l'indicateur -lc++ fonctionnait également:

gcc -lc++ main.cpp
1
Alistair A. Israel

S'agit-il de GCC sous Windows (MinGW) ou Linux? Sur MinGW, vous avez besoin des paramètres -lmingw32 -enable-auto-import. Linux pourrait avoir besoin de quelque chose de similaire, -enable-auto-import est probablement nécessaire.

0
Frigo