2016-07-31 20 views
1

Ich habe einige Dateien wie:Können Sie beim Verknüpfen von Objektdateien mit GCC unabhängige Abstraktionsschichten erstellen?

a.c a.h 
b.c b.h 
c.c c.h 
d.c d.h 

wo ein b verwendet, b verwendet c verwendet c d.

Beim Kompilieren, gibt es eine Möglichkeit, dass ich nur eine direkte Verbindung zu b herstellen kann, anstatt sie alle in meine Kompilierungsanweisung aufzunehmen?

irgendwie verwenden:

gcc a.o b.o 

statt:

gcc a.o b.o c.o d.o 

ich dies tun will, so dass ein nicht befürchten muss, wenn b oder c oder d durchgeführt wird unter Verwendung eines beliebigen anderen Dateien, und stattdessen kann nur direkt auf bo zeigen

Side Frage, gibt es eine Möglichkeit, auch eine Wildcard-Objekt Befehl wie das geht auch in die Datei rekursiv gehen:

gcc *.o 

Ich bin gespannt und nur für den Fall der besten Fall oben ist nicht möglich

+0

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

Antwort

1

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.