Sie scheinen ein leichtes Missverständnis, wie die Zusammenstellung und Arbeitsgesellschaft zu haben.
Angenommen, die Dateien wie folgt aussehen:
//a.h
// nothing in particular
//a.c
#include "b.h"
int main()
{
bravo();
return 0;
}
//b.h
void bravo();
//b.c
#include "c.h"
void bravo()
{
charlie();
}
//c.h
void charlie();
//c.c
#include "d.h"
void charlie()
{
delta();
}
und so weiter.
Wie Sie sehen können, bezieht sich der Code in a.c
in b.h
und in b.c
definiert erklärt codieren. Es bezieht sich auf nichts in c
oder d
.
Sie können a.o
von Kompilieren [1] bauen:
gcc -c a.c
Die „-c“ bedeutet „bauen die binäre Objektdatei und stoppen, versuchen Sie nicht, eine ausführbare Datei zu bauen“. Der Compiler merkt die Zeile
und zieht "b.h" in den Code. Es sieht nicht b.c
, weil niemand es gesagt hat. Es sieht, dass dieser Code bravo()
verwendet, der nicht definiert wurde, und es vertraut, dass jemand diese Funktion bereitstellen wird, wenn es Zeit wird, eine ausführbare Datei zu erstellen. Der Compiler kennt weder b.c
, charlie()
, delta()
noch irgendeine der Dateien c
oder d
.
Wenn es darum geht, eine ausführbare Datei zu erstellen, die Linker ins Spiel kommen [2]:
gcc a.o b.o c.o d.o
Der Linker eine ausführbare Datei aus diesen Dateien, weil alle Funktionen aufbauen kann, die aufgerufen werden, sind definiert, so dass es alle losen Enden binden kann.Dies ist:
gcc a.o b.o
wird nicht funktionieren. Der Linker sagt "Halt, ich kann kein komplettes Programm daraus erstellen, rufen Sie charlie()
, aber ich sehe keine Definition von charlie()
!"
[1] Es gibt einige Meinungsverschiedenheiten darüber, ob dies "kompilieren a.c
" oder "kompilieren a.o" genannt werden soll, aber das ist hier nicht wichtig.
[2] Beachten Sie, dass gcc sowohl einen Compiler und einen Linker als auch andere Dinge enthält. Es ist wie ein Schweizer Taschenmesser.
Erklären Sie, was Sie mit "wo verwendet, verwendet b, b verwendet c, c verwendet d.", Haben Sie drei Programme oder Bibliotheken? Wenn Sie eine Teilmenge von Objektdateien verknüpfen müssen, dann sagen Sie einfach so: 'someapp: a.o b.o'. – user657267