Unterschied zwischen Objekt-code und die ausführbare Datei
Ich bin ein C++ Anfänger und ich studiere die Grundlagen der Sprache. Es gibt ein Thema in meinem Buch über den compiler und mein problem ist, dass ich nicht verstehen kann, was der text sagen will:
C++ ist eine kompilierte Sprache, so müssen Sie übersetzen den Quellcode in
eine Datei, die der computer ausführen kann. Diese Datei wird generiert, indem die
compiler und wird aufgerufen, den Objekt-code ( .obj ), aber ein Programm wie
die "Hallo Welt" - Programm besteht aus einem Teil, das wir geschrieben haben, und ein Teil
der C++ - Bibliothek. Der linker verbindet die beiden Teile eines Programms und
erzeugt eine ausführbare Datei ( .exe-Datei ).
Warum mein Buch sagen, dass die Datei, die ausgeführt wird, durch den computer, ist das mit dem obj suffix (Objekt-code) und dann sagen, dass es ist die mit den exe suffix?
InformationsquelleAutor der Frage Piero Borrelli | 2014-09-17
Du musst angemeldet sein, um einen Kommentar abzugeben.
Objekt-Dateien sind source kompiliert in binäre Maschinensprache, aber Sie enthalten nicht aufgelöste externe Verweise (wie
printf
zum Beispiel). Sie müssen verbunden werden, gegen die anderen Objekt-Dateien, Bibliotheken von Drittanbietern und fast immer gegen die C/C++ - Laufzeit-Bibliothek.In Unix -, sowohl Objekt-und exe-Dateien sind die gleichen COFF-format. Der einzige Unterschied ist, dass die Objekt-Dateien nicht aufgelöste externe Verweise, während ein.out-Dateien nicht.
InformationsquelleAutor der Antwort ArunasR
Die C++ - Spezifikation ist ein technisches Dokument, in englischer Sprache. Für C++11 mal im n3337 (oder verbringen eine Menge Geld zu kaufen, das Taschenbuch ISO-standard). In der Theorie Sie don ' T brauchen einen computer zum ausführen eines C++ - Programms (man könnte ein paar menschliche Sklaven, aber das wäre unmoralisch, ineffizient und unzuverlässig).
Könnten Sie eine C++ - Implementierung ist ein Dolmetschernicht ein compiler (z.B. Ch SoftIntegration)
Wenn Sie die Installation von Linux auf Ihrem laptop haben (was ich empfehlen Sie tun, um jeden Schüler) dann könnte man mehrere freie software C++ - Compilern, insbesondere GCC und Clang/LLVM (mit
g++
undclang
Befehle beziehungsweise). Quelldateien mit dem Suffix.cc
oder.cxx
oder.cpp
oder sogar.C
(ich bevorzuge.cc
), und Sie könnten Fragen, die der compiler verarbeiten eine Datei von einem anderen suffix als C++ - source-Datei (das ist aber nicht die herkömmlichen). Dann Objekt-Dateien (Suffix.o
) und executables teilen die gleichen ELF - format. Konventionell, ausführbare haben keine Dateiendung (z.B.g++
ist eine ausführbare Binärdatei, nicht viel tun, außer andere Prozesse wiecc1plus
-die richtigen compiler-,as
-die assembler-,ld
-die linker- etc...)In allen Fällen, die ich empfehle:
g++ -Wall -g
....)gdb
)emacs
gedit
geany
odergvim
make
Konkret, auf Linux könnte man "Bearbeiten" Hello World " - Programm (file -
hello.cc
) mitgedit
oderemacs
(mit einem Befehl wiegedit hello.cc
) etc..., kompilieren Sie es mitg++ -Wall -g hello.cc -o hello
Befehl Debuggen mitgdb ./hello
und wiederholen Sie (vergessen Sie nicht, verwendengit
Befehle für die Versionsverwaltung).Manchmal macht es Sinn zu generieren einige C++ - code, z.B. durch einige shell -, Python -, oder
awk
Skript (oder sogar von Ihrem eigenen Programm codiert in C++ generiert C++ - code!).Auch verstehen, dass ein IDE ist nicht ein compiler (läuft aber der compiler für Sie).
InformationsquelleAutor der Antwort Basile Starynkevitch
Den verwendeten Sprachen zur Programmierung von Computern zusammen mit den verschiedenen software-Entwicklungs-tools haben sich im Laufe der Jahre.
Die ersten Computer wurden programmiert mit zahlen eingegeben, die durch Schalter auf einer Konsole.
Dann Menschen begann mit der Entwicklung von Sprachen und software, die verwendet werden könnte, um software zu erstellen, leichter und schneller. Die erste wichtige Entwicklung war die Schaffung von assembler-Sprache, wo jede Zeile der Quelle umgewandelt wurde, die von einem computer-Programm in eine Maschinencode-Instruktion. Zusammen mit diesem kam die Entwicklung des linkers (die link-Stücke von Maschinencode, die zusammen in größere Stücke). Monteure wurden verbessert durch das hinzufügen einer makro-oder Präprozessor etwas wie die C/C++ - Präprozessor, obwohl ausgelegt für den Assembler.
Dann die Menschen geschaffen Programmiersprachen, die sahen eher aus wie Menschen Sprachen, anstatt assembler (FORTRAN und COBOL und ALGOL beispielsweise). Diese Sprachen waren einfacher zu Lesen und eine einzelne Zeile der Quelle könnte umgewandelt werden in mehrere Maschinenbefehle so war es produktiver, zu schreiben computer-Programme in diesen Sprachen eher als assembler.
Die Programmiersprache C war eine spätere Verfeinerung mit Erfahrungen aus der frühen Programmiersprachen wie FORTRAN. Und C verwendet einige der gleichen software-Entwicklungs-tools, die bereits existierte, wie linkers, die bereits bestanden. Noch später C++ erfunden wurde, angefangen als eine Verfeinerung von C Einführung in Objekt-orientierten Einrichtungen. In der Tat das erste C++ - compiler war wirklich ein C++ - übersetzer die übersetzten C++ - source-code in C-source-code, der anschließend kompiliert mit einem C-compiler. Aber moderne C++ kompiliert wird gerade von machine code, um die volle Funktionalität der C++ - standard-templates, lambdas, und all die anderen Dinge, die mit C++11 und höher.
Die grundlegenden Schritte zum erstellen einer Anwendung, die aus einem C-oder C++ - Quelldatei sind wie folgt:
(1) die source-Dateien erstellt werden, (2) die Quellcode-Dateien, kompiliert werden (das ist wirklich zwei Schritte, Präprozessor und Zusammenstellung), (3) die Objekt-Dateien, die erstellt werden, durch die C/C++ - compiler verknüpft sind zu erstellen .exe
So haben Sie diese Schritte der Transformation eine version des computer-Programm zu einem anderen. Die C++ - Quelldatei kompiliert wird, erzeugen der object-Dateien. Die Objekt-Dateien sind miteinander verbunden zum erzeugen der ausführbaren Datei.
Wenn Sie ein Programm ausführen, führen Sie die ausführbare Datei. Die ausführbare Datei enthält mehrere Arten von Informationen. Die erste ist die Maschinenbefehle, die das Ergebnis der Kompilierung der C++ - Quellcode. Das andere ist die information, dass der loader nutzt, um zu wissen, wie laden Sie die ausführbare Datei in den Speicher.
In den alten Tagen, vor langer Zeit alle Bibliotheken und Objekt-Dateien verbunden waren, die zusammen in einer ausführbaren Datei und die ausführbare Datei wurde geladen, der loader und der Lader war ziemlich einfach.
Dann werden die Menschen erfunden, shared libraries und dynamische link-Bibliotheken und die loader komplexer zu sein. Nicht nur, dass der loader laden Sie die ausführbare Datei in den Speicher, so dass Sie beginnen können läuft der loader muss hier auch jeden shared libraries oder dynamic link libraries, sind auch nötig, und laden Sie diese zu. Und der Lader hat auch damit zu tun, eine bestimmte Menge der Verbindung der zusätzlichen Komponenten, die shared-libraries, so dass der Lader nicht viel mehr, als es zu tun.
InformationsquelleAutor der Antwort Richard Chambers
Objekt-code (innerhalb einer Objekt-Datei): Ausgabe von einem compiler gedacht als input für eine linker (für den linker zu erzeugen ausführbarer code).
Ausführbar: Ein Programm bereit, ausgeführt zu werden (ausgeführt) auf einem computer
InformationsquelleAutor der Antwort Pablo