2016-04-17 16 views
7

Ich möchte wissen, wann ich ld Linker anstelle von gcc verwenden sollte. Ich habe gerade eine einfache Hallo-Welt in C++ geschrieben, natürlich schließe ich Iostream-Bibliothek ein. Wenn ich eine Binärdatei mit gcc machen möchte, verwende ich einfach:Wann sollte ich anstelle von gcc ld verwenden?

g++ hello hello.cpp und ich habe meine Binärdatei.

Später versuche ich, ld-Linker zu verwenden. Um eine Objektdatei zu erhalten, verwende ich: g++ -c hello.cpp. Ok, das war einfach, aber der Link Befehl war schrecklich lang:

ld -o hello.out hello.o -L /usr/lib/gcc/x86_64-linux-gnu/4.8.4/ /usr/lib/gcc/x86_64-linux-gnu/4.8.4/crtbegin.o /usr/lib/gcc/x86_64-linux-gnu/4.8.4/crtend.o /usr/lib/x86_64-linux-gnu/crti.o /usr/lib/x86_64-linux-gnu/crtn.o /usr/lib/x86_64-linux-gnu/crt1.o -dynamic-linker /lib64/ld-linux-x86-64.so.2 -lstdc++ -lc.

Ich weiß Tatsache, dass gcc die LD verwendet. Mit gcc ist in allen Fällen oder nur in den meisten Fällen besser? Bitte sagen Sie mir etwas über Fälle, in denen LD-Linker einen Vorteil hat.

+1

Die direkte Verwendung des Linkers hat nur dann einen Vorteil, wenn Sie GCC nicht verwenden. Andernfalls sparen Sie mit 'gcc' oder' g ++ 'viel Tipparbeit und, was noch wichtiger ist, all die Trauer, die damit verbunden ist, genau herauszufinden, was Sie tippen müssen und wann. –

+0

Danke, ich hatte Angst darüber, dass ich keine hilfreiche Verwendung von ld bemerkt habe. Btw Sie können g++ -v -o hello hello.cpp verwenden, welche Bibliotheken Sie verknüpfen müssen. Also alle funktionen über link files/liberries kann ich mit gcc einstellen? – Ice

+1

Das Problem ist, dass sich die Liste der Objektdateien, Bibliotheken und Optionen ändert, je nachdem, welche GCC-Optionen Sie verwenden, welches Betriebssystem Sie verwenden, welche Version von GCC und möglicherweise andere Faktoren. Beachten Sie, dass Sie eine mit GCC erstellte Objektdatei verknüpfen können, indem Sie einen Befehl wie 'gcc -o hallo hello.o' verwenden. –

Antwort

6

Wie Sie bereits erwähnt haben, fungiert gcc lediglich als Front-End für die Link-Zeit. Es übergibt alle Linker-Anweisungen (Optionen, Standard/System-Bibliotheken, etc ..) und stellt sicher, dass alles gut zusammenpasst, indem Sie sich um all diese toolchain spezifischen Details für Sie kümmern.

Ich glaube, es ist am besten, die GNU-Toolchain als eine ganze, eng integrierte Umgebung zu betrachten (wie jeder mit der Erfahrung beim Erstellen von Toolchains für einige exotische Embedded-Plattformen mit, sagen wir, Dietlibc-Integration wird wahrscheinlich zustimmen).

Es sei denn, Sie haben einige sehr spezifische Plattformintegrationsanforderungen, oder haben Gründe, gcc nicht zu verwenden, kann ich kaum einen Vorteil des Aufrufs ld direkt für das Verknüpfen denken. Jede extra Linker-spezifische Option, die Sie möglicherweise benötigen, könnte leicht mit dem Präfix -Wl, in der gcc-Befehlszeile angegeben werden (falls nicht bereits als einfache gcc-Option verfügbar).

+1

Fazit, ld gibt Ihnen mehr Kontrolle/Wissen über die Dateien, die verknüpft sind, verstehe ich richtig? – Ice

+1

Es ist mehr eine Frage von gcc, die eine schöne, schmerzfreie Integration garantiert (siehe @RossRidges Kommentar zu den verschiedenen Faktoren). Jede ld-Option, die Sie möglicherweise benötigen, kann mit "-Wl," weiterhin gcc passieren. – xbug

2

Es ist meistens eine Frage des Geschmacks: Sie würden ld direkt verwenden, wenn die Befehlszeilen einfacher sind als mit gcc. Das wäre, wenn Sie nur den Linker verwenden, um eine kleine Anzahl von gemeinsam genutzten Objekten zu bearbeiten, z. B. um eine gemeinsam genutzte Bibliothek mit wenigen Abhängigkeiten zu erstellen.

Da Sie Optionen ld über die Option -Wl übergeben können, empfehlen die Benutzer oft nur gcc, um die Befehlszeile zu verwalten.

Verwandte Themen