J'ai le code source suivant dans MAIN.CPP:
ld: warning: cannot find entry symbol _start; defaulting to 00000000004000e8 main.o: In function `main': main.cpp:(.text+0xa): undefined reference to `std::cout' main.cpp:(.text+0xf): undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)' main.cpp:(.text+0x14): undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::endl<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&)' main.cpp:(.text+0x1c): undefined reference to `std::ostream::operator<<(std::ostream& (*)(std::ostream&))' main.o: In function `__static_initialization_and_destruction_0(int, int)': main.cpp:(.text+0x4a): undefined reference to `std::ios_base::Init::Init()' main.cpp:(.text+0x4f): undefined reference to `std::ios_base::Init::~Init()' main.cpp:(.text+0x54): undefined reference to `__dso_handle' main.cpp:(.text+0x61): undefined reference to `__cxa_atexit'
4 Réponses :
Je pense que si vous utilisez ld code> directement, il n'inclut pas les bibliothèques C ++ par défaut. Vous pouvez utiliser
g ++ code> pour effectuer également le lien, il appellera
ld code> avec les paramètres corrects.
g++ -c main.cpp
g++ -o main main.o
Lorsque vous utilisez Essayez (non testé): p> ou vous pouvez examiner la syntaxe correcte en lisant ce manuel: P> g ++ code>, il relie également la bibliothèque
LIBSTD ++ CODE> QUELLE LINKER utilise pour résoudre les noms. Mais en utilisant
g ++ -c code>, puis
ld code> Ne liez pas automatiquement la bibliothèque automatiquement. Vous devez lier la bibliothèque manuellement maintenant.
Le drapeau à lien avec la bibliothèque LIBSTDC ++ est -LSTDC ++
Eh bien, vous n'avez pas de lien dans la bibliothèque standard. BTW, strictement parlant, l'équivalent de ( Il s'agira également de lier dans l'exécution et éventuellement d'autres choses. P> En général, il n'est pas nécessaire d'essayer de faire ces choses vous-même: Laissez g ++ code> Est-ce que cela vous convient automatiquement? C'est pourquoi nous l'utilisons: il enveloppons les appels vers
ccplus1 code> et
ld code> avec tous les extras pris en charge.
g ++ main.cpp -o principal code> est: p>
cc1plus code> peut ne pas être sur votre chemin; j'ai trouvé le mien dans
/usr/libexec/gcc/i386-redhat-linux/4.1.1 / code>) sup> p>
g ++ -c main.cpp code> effectue traditionnellement cette première étape.
g ++ main.cpp -o principal code> wraps " p>
g ++ code> est un wrapper em> dans les outils de compilation et de liaison individuels, à l'écoute de C ++. En tant que tel, il fournit des arguments à
cc1plus code> et
ld code> car il voit l'ajustement, y compris l'argument à lier dans la bibliothèque standard C ++: p>
g ++ code> prendre soin de cela. p> p>
GCC liens internes contre quelques bibliothèques et fichiers d'objet supplémentaires. Pour voir ce que ce sont, exécutez /usr/lib/gcc/I686-PC-LINUX-GNU/4.6.0/CollectT2 --Build-ID --Eh-Frame-HDR -M elf_I386 "- STYLE DE STYLE =" -DYNAMIC- Linker /Lib/ld-linux.so.2 /USR/LIB/GCC/I686-PC-LINUX-GNU/4.6.0/../../../crt1.o / usr / LIB / GCC / I686 -pc-linux-gnu / 4.6.0 /../../../ crti.o /usr/lib/gcc/i686-pc-linux-gnu/4.6.0/crtbegin.o -l / usr / LIB / GCC / I686-PC-Linux-GNU / 4.6.0 -L / USR / LIB / GCC / I686-PC-Linux-GNU / 4.6.0 /../../ .. main1.o FORT> "-LSTDC ++" -LM -LGCC_S -LGCC -LC -LGCC_S -LGCC /USR/LIB/GCC/I686-PC-LINUX-GNU/4.6.0/CRTEND.O / USR / LIB / GCC / I686 -pc-linux-gnu / 4.6.0 /../../../ crtn.o p>
blockQuote>
Vous pouvez substituer le chemin Exécution de cette commande, avec - ### code>, qui imprimera les commandes d'outils qu'il exécuterait, y compris la liaison. La commande de liaison utilisé par mon GCC est (j'ai fait le fichier
.O code> i
g ++ code> sur gras fort>, afin que vous puissiez la repérer facilement) . p>
Collect2 code> par
ld code> (si je me souviens bien,
collect2 code> n'est nécessaire que comme proxy pour le vrai
LD code> par GCC Backends qui ne prennent pas en charge les formats binaires modernes, pour collecter des fonctions de constructeur et de destructeur en fonction de leur nom gigrané. Le format ELF a un support de sections indigènes pour cela). p>
ld code> substitué littéralement, lie avec succès l'exécutable. p>
ld ne sait pas sur libstdc ++
Ne appelez pas LD directement, sauf si vous en avez vraiment besoin.