2011-09-23 3 views
37

Je tente de compiler ce code cpp sur osx lion mais j'obtiens une erreur.Erreur lors de la compilation du code C++ simple

#include <iostream> 

using namespace std; 

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

    return 0; 
} 

Pour 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 
+4

C'est un problème de lien. Comment liez-vous? –

+0

Je suis nouveau à cpp, je ne comprends pas vraiment votre question. : –

+3

Quelles instructions avez-vous utilisé pour compiler et lier? Quel compilateur? –

Répondre

76

Normalement, ce type d'erreur se produit lors de la compilation de votre code C++ en appelant le frontal C. Le gcc que vous exécutez comprend et compile le fichier en C++, mais ne le lie 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 voir, en utilisant 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 (que je vous recommande):

$ 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 voir dans le message d'erreur clang, vous pouvez utiliser -v pour voir l'invocation de linker pour voir qu'est-ce qui ne va pas? Il vous montrer 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, il est relier le moteur d'exécution C, pas C++, et aussi ne pas les bibliothèques C++. En utilisant clang++ la ligne de liaison 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 voir, libstdc++ est inclus, et presto - aucune erreur de lien.

+10

+1 pour recommander clang. –

+2

en utilisant clang ++ travaillé. –

+2

Oups! J'ai oublié d'ajouter mon fichier 'other.c' à l'argument de la commande' clang'. Je viens de faire 'clang main.c'. Faire 'clang main.c other.c' a fonctionné. (J'ai '#include" other.h "' en haut de 'main.c'. – ma11hew28

3

Je ne suis pas familier avec Mac OS X LION. Cependant, au sens 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 n'est pas liée.

3

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

0

Est-ce GCC sur Windows (MinGW) ou Linux? Sur MinGW, vous avez besoin des paramètres -lmingw32 -enable-auto-import. Linux peut avoir besoin de quelque chose de similaire, -enable-auto-import est probablement nécessaire.

+0

La question de l'OP dit 'osx lion' –

+0

Apparemment, je ne peux pas lire -_- – Frigo

5

Essayez

g++ main.cpp 

De cette façon, il devrait fonctionner, au moins en utilisant OS X

1

A partir de Yosemite (10.10.1), j'ai trouvé que gcc avec le drapeau -lc++ fonctionne également:

gcc -lc++ main.cpp 
0

Si vous utilisez clang sur OS X, essayez:

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

Voilà la solution qui fonctionne sur Mac OS Sierra:

Il y a deux implémentations de la bibliothèque standard C++ disponible sur OS X: libstdC++ et ++ libc. Ils ne sont pas compatibles binary et libMLi3 requiert libstdC++.

Le 10.8 et plus tôt libstdC++ est choisi par défaut, sur 10.9 libC++ est choisi par défaut. Pour assurer la compatibilité avec libMLi3, nous devons choisir libstdC++ manuellement.

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

Questions connexes