10
votes

Utilisation uniquement des œuvres G ++, mais pas "g ++ -c" et ld

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'


2 commentaires

ld ne sait pas sur libstdc ++


Ne appelez pas LD directement, sauf si vous en avez vraiment besoin.


4 Réponses :


14
votes

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


0 commentaires

8
votes

Lorsque vous utilisez g ++ , il relie également la bibliothèque LIBSTD ++ QUELLE LINKER utilise pour résoudre les noms. Mais en utilisant g ++ -c , puis ld Ne liez pas automatiquement la bibliothèque automatiquement. Vous devez lier la bibliothèque manuellement maintenant.

Essayez (non testé): xxx

ou vous pouvez examiner la syntaxe correcte en lisant ce manuel:


1 commentaires

Le drapeau à lien avec la bibliothèque LIBSTDC ++ est -LSTDC ++



1
votes

Eh bien, vous n'avez pas de lien dans la bibliothèque standard. g ++ Est-ce que cela vous convient automatiquement? C'est pourquoi nous l'utilisons: il enveloppons les appels vers ccplus1 et ld avec tous les extras pris en charge.

BTW, strictement parlant, l'équivalent de g ++ main.cpp -o principal est: xxx

( cc1plus peut 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 effectue traditionnellement cette première étape. g ++ main.cpp -o principal wraps "

g ++ est un wrapper dans les outils de compilation et de liaison individuels, à l'écoute de C ++. En tant que tel, il fournit des arguments à cc1plus et ld car il voit l'ajustement, y compris l'argument à lier dans la bibliothèque standard C ++: xxx

Il s'agira également de lier dans l'exécution et éventuellement d'autres choses.

En général, il n'est pas nécessaire d'essayer de faire ces choses vous-même: Laissez g ++ prendre soin de cela.


0 commentaires

13
votes

GCC liens internes contre quelques bibliothèques et fichiers d'objet supplémentaires. Pour voir ce que ce sont, exécutez - ### , 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 i g ++ sur gras , afin que vous puissiez la repérer facilement) .

/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 "-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

Vous pouvez substituer le chemin Collect2 par ld (si je me souviens bien, collect2 n'est nécessaire que comme proxy pour le vrai LD 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).

Exécution de cette commande, avec ld substitué littéralement, lie avec succès l'exécutable.


0 commentaires