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
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.
Essayer
g++ main.cpp
De cette façon, cela devrait fonctionner, au moins avec OS X
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.
Utilisez la commande CC (majuscule) pour compiler C++ et vous connecter à la bibliothèque C++ standard.
Si vous utilisez Clang sous 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 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.
Depuis Yosemite (10.10.1), j'ai trouvé que gcc
avec l'indicateur -lc++
fonctionnait également:
gcc -lc++ main.cpp
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.