2016-06-28 10 views
0

Ich habe drei c-Dateien und deren Header-Dateien:..Makefile Ziel erfordert die Abhängigkeit von anderen Ziel

  1. main/Programm {c, h}
  2. lib/lib1 {c, h}
  3. lib/lib2. {c, h}

program hängt von lib1.o, die auf lib2.o abhängt. program hängt nicht direkt von lib2.o ab.

program.main() Anrufe lib1.func1(), die lib2.func2() ruft.

Ich habe zwei Makefile s; eins im Hauptordner und ein anderes in lib.

lib/Makefile:

all: lib1.o lib2.o 

lib1.o: lib2.o lib2.h lib1.h 

lib2.o: lib2.h 

main/Makefile:

VPATH=../lib 

all: program 

program: program.o lib1.o lib1.h 
    $(CC) $(CFLAGS) -o [email protected] $^ 

Wenn ich laufen make -C main all, erhalte ich eine undefined reference to 'func2' Fehler. Beide lib Objektdateien kompiliert fein.

Muss ich lib2 eine Abhängigkeit von program machen, obwohl es es nicht direkt aufruft?

+0

Objektdateien sind eigenständige Übersetzungseinheiten. Sie müssen alle Objektdateien auflisten, die für das Ziel 'program' benötigt werden. –

+0

Also muss ich lib2.o als eine Abhängigkeit des Programms enthalten? – retrodev

+0

Wo sind die Rezepte? Sind diese Makefiles nur Schnipsel oder sind sie vollständig? – 2501

Antwort

1

Ja. lib1.o enthält einen Verweis auf eine Funktion, die nur in lib2.o existiert. Wenn Sie dem Linker von main nicht mitteilen, dass er auch mit lib2.o verlinkt, wird er es nie finden. Der Compiler löst die Referenz von lib1 zu lib2 zur Kompilierzeit nicht auf, sondern überprüft nur die Kopfzeile, um sicherzustellen, dass sie korrekt aufgerufen wird.

Sie könnten Sie lib-Verzeichnis Makefile Build ein .a (manar), die beide O-Dateien enthält, dann verknüpfen Sie gegen die A-Datei von Ihrem Hauptbuild.

+0

Ich verstehe. Muss ich also lib2.o als Abhängigkeit für lib1.o auflisten? – retrodev

+0

Ja. Sie machen. Oder erstellen Sie eine lib.a-Datei, die beide O-Dateien enthält. – tad