En utilisant uniquement g++ fonctionne, mais pas de “g++ -c” et ld
J'ai le code source suivant dans main.cpp:
#include <iostream>
#include <iomanip>
int main() {
std::cout << "Hi" << std::endl;
return 0;
}
À l'aide de cette commande fonctionne, et crée le fichier exécutable:
g++ -o main main.cpp
Mais ces commandes ne fonctionnent pas:
g++ -c main.cpp
ld -o main main.o
La seconde erreurs avec:
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'
ld ne sais pas à propos de libstdc++
Ne pas appeler ld directement, à moins que vous vraiment besoin.
Ne pas appeler ld directement, à moins que vous vraiment besoin.
OriginalL'auteur Valentin Lorentz | 2011-07-15
Vous devez vous connecter pour publier un commentaire.
Je pense que si vous utilisez
ld
directement ne comprennent pas le C++ bibliothèques par défaut. Vous pouvez utiliserg++
à faire le lien, il va appelerld
avec les paramètres corrects.OriginalL'auteur Sodved
GCC en interne des liens à l'encontre de quelques autres bibliothèques et les fichiers objets. Pour voir ce que ceux qui sont, exécuter
-###
, ce qui permet d'imprimer les commandes de l'outil, il sera responsable de l'exécution, y compris l'éditeur de liens. L'éditeur de liens de commande utilisé par mon GCC (j'ai fait la réelle.o
fichier que j'ai invoquég++
sur gras, de sorte que vous pouvez les repérer facilement).Vous pouvez remplacer le
collect2
chemin parld
(si je me souviens bien,collect2
est nécessaire uniquement comme un proxy pour le réelld
par GCC backends qui ne prennent pas en charge moderne de formats binaires, à recueillir constructeur et le destructeur des fonctions selon leur nom décomposé. L'ELFE, le format natif des sections d'appui).L'exécution de cette commande, avec
ld
substitué littéralement, avec succès, les liens de l'exécutable.OriginalL'auteur Johannes Schaub - litb
Lorsque vous utilisez
g++
, il relie également lalibstd++
bibliothèque de l'éditeur de liens utilise pour résoudre les noms. Mais à l'aide deg++ -c
et puisld
ne pas lier la bibliothèque automatiquement. Vous avez pour lier la bibliothèque manuellement.Essayer (non testé):
Ou vous pouvez regarder dans la syntaxe correcte par la lecture de ce manuel:
OriginalL'auteur Nawaz
Bien, vous n'avez pas de lien dans la bibliothèque standard.
g++
le fait pour vous automatiquement, c'est pourquoi nous l'utilisons: il encapsule les appels àccplus1
etld
avec tous les extras pris soin de.BTW, à proprement parler, l'équivalent de
g++ main.cpp -o main
est:(
cc1plus
peut très bien ne pas être sur votre chemin; j'ai trouvé le mien dans/usr/libexec/gcc/i386-redhat-linux/4.1.1/
)g++ -c main.cpp
n'traditionnellement effectuer la première étape.g++ main.cpp -o main
englobe à la fois.g++
est un wrapper à l'individu compilation de liaison et d'outils, à l'écoute pour C++. En tant que tel, il fournit des arguments àcc1plus
etld
comme il l'entend, y compris l'argument le lien dans le Standard C++ Library:Il va également le lien dans le moteur d'exécution et peut-être quelques autres trucs.
En général, il n'est pas nécessaire d'essayer de faire ces choses vous-même: laissez
g++
prendre soin d'elle.OriginalL'auteur Lightness Races in Orbit