Erreur lors de la compilation d’un code c ++ simple

J’essaie de comstackr ce code cpp sur osx lion mais j’ai une erreur.

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

Comstackr:

 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 >& std::operator<< <std::char_traits >(std::basic_ostream<char, std::char_traits >&, char const*)", referenced from: _main in ccBdbc76.o "std::basic_ostream<char, std::char_traits >& std::endl<char, std::char_traits >(std::basic_ostream<char, std::char_traits >&)", referenced from: _main in ccBdbc76.o "std::basic_ostream<char, std::char_traits >::operator<<(std::basic_ostream<char, std::char_traits >& (*)(std::basic_ostream<char, std::char_traits >&))", 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 

Normalement, ce type d’échec se produit lors de la compilation de votre code C ++ en appelant le front-end C. Le gcc vous exécutez comprend et comstack 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 >& std::operator<<  >(std::basic_ostream >&, char const*)", referenced from: _main in ccLTUBHJ.o "std::basic_ostream >& std::endl >(std::basic_ostream >&)", referenced from: _main in ccLTUBHJ.o "std::basic_ostream >::operator<<(std::basic_ostream >& (*)(std::basic_ostream >&))", 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, 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 (que je 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 >& std::endl >(std::basic_ostream >&)", referenced from: _main in cc-IeV9O1.o "std::basic_ostream >& std::operator<<  >(std::basic_ostream >&, 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'appel de l'éditeur de liens pour voir ce qui ne va pas. Il 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, il relie le runtime C, pas C ++, et n'a pas non plus les bibliothèques C ++. En utilisant clang++ la ligne de lien est la suivante:

 "/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 vous éviterez les erreurs de lien.

Essayer

 g++ main.cpp 

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

Je ne suis pas familier avec OSX LION. Cependant, au sens ssortingct, 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.

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

A partir de Yosemite (10.10.1), j’ai trouvé que gcc avec l’ -lc++ fonctionne aussi:

 gcc -lc++ main.cpp 

Si vous utilisez clang sur OS X, essayez:

 clang++ simple_cpp_program_file.cpp -o simple_cpp_program_file.out 

Voici la solution qui fonctionne sur MacOs Sierra:

Il existe deux implémentations de la bibliothèque C ++ standard disponible sous OS X: libstdc ++ et libc ++. Ils ne sont pas compatibles avec les binarys et libMLi3 nécessite libstdc ++.

Le 10.8 et les versions antérieures, libstdc ++ est choisi par défaut, sur 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.

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