Makefile: Lib einbinden



  • Hallo,
    ich möchte gerne eine statische lib in meine Ziele im Makefile einbinden.

    Die Lib erstelle ich auf folgende Art:

    genstacklib: genstacklib.o check.o
    	$(AR) $(AR_OPTION) $@ $^
    

    Mir ist bewusst, dass man statische libs eigentlich liblibname.a benennt. Allerdings ist das wirklich eine klare Vorgabe die Lib "genstacklib" zu benennen.

    Das Erstellen funktioniert jedenfalls wunderbar, nur das Linken nicht wirklich.
    Bevor ich eine lib daraus gemacht habe, funktionierte noch alles, aber seit dem ich das so mache, habe ich Probleme:

    gentest1: genstacklib gentest1.o check.o 
    	$(CC) $(CFLAGS) $(CPPFLAGS) $^ -o $@
    

    Die -llibname Option lasse ich extra weg, weil diese Funktion laut der Manual sowieso nichts besonderes macht gegenüber dem normalem Linken:

    Normally the files found this way are library files---archive files whose members are object files. The linker handles an archive file by scanning through it for members which define symbols that have so far been referenced but not defined. But if the file that is found is an ordinary object file, it is linked in the usual fashion. The only difference between using an -l option and specifying a file name is that -l surrounds library with lib and .a and searches several directories.

    Allerdings bekomme ich immer diese Fehlermeldung:

    gcc -W -Wall -ansi -pedantic -D_XOPEN_SOURCE=600 -I ./test -DNDEBUG genstacklib gentest7.o check.o -o gentest7
    gentest7.o: In function main': gentest7.c: (.text+0x21): undefined reference toGenStackNew'
    gentest7.c: (.text+0xab): undefined reference to GenStackPush' gentest7.c: (.text+0xc5): undefined reference toGenStackDispose'
    collect2: ld returned 1 exit status
    make: *** [gentest7] Error 1

    Ich hatte testweise auch die -llibname Option benutzt und die lib unbenannt. Allerdings bekam ich denselben Fehler.

    Weiß jemand vielleicht weiter?

    Danke im Voraus!

    L. G.
    Steffo


  • Mod

    Vermutlich passt die Reihenfolge nicht. Mach dich mal kundig, was die Reihenfolge der Dateien beim GCC bedeutet. Falls genstacklib die fehlenden Symbole definiert, duerfen diese nicht mehr in den folgenden Dateien benutzt werden.



  • Du meinst die -MM Option?

    Die liefert:

    genstacklib.o: genstacklib.c genstacklib.h check.h test/debug.h
    
    gentest1.o: gentest1.c genstacklib.h
    

    Habe das Makefile etwas geändert:

    genstacklib: genstacklib.o check.o
    	$(AR) $(AR_OPTION) $@ $^
    
    gentest1: genstacklib gentest1.o
    	$(CC) $(CFLAGS) $(CPPFLAGS) $^ -o $@
    

    Gleicher Fehler...



  • Probiere mal

    gcc -W -Wall -ansi -pedantic -D_XOPEN_SOURCE=600 -I ./test -DNDEBUG gentest7.o check.o genstacklib -o gentest7
    

    genstacklib als letztes dazulinken (so wie SeppJ es wohl auch meinte).



  • WOW, danke! Das funktioniert!!! 🙂
    Kurze Frage: Mir ist leider immernoch nicht ganz klar, weshalb hier die Reihenfolge eine Rolle spielt. Ich hatte eher gedacht, dass man zuerst die Lib, die benötigt wird, zuerst angeben sollte, damit der Linker sie sofort findet. Aber dass die Lib als letztes angegeben werden soll, ist mir nicht klar. 😞

    L. G.
    Steffo


  • Mod

    Steffo schrieb:

    WOW, danke! Das funktioniert!!! 🙂
    Kurze Frage: Mir ist leider immernoch nicht ganz klar, weshalb hier die Reihenfolge eine Rolle spielt. Ich hatte eher gedacht, dass man zuerst die Lib, die benötigt wird, zuerst angeben sollte, damit der Linker sie sofort findet. Aber dass die Lib als letztes angegeben werden soll, ist mir nicht klar. 😞

    L. G.
    Steffo

    Tja, du denkst eben falsch rum. Was soll man da noch gross erklaeren, ausser, wie oben schon, auf die Anleitung zu verweisen? (In der dann auch nichts anderes steht, als dass es einfach so ist)



  • Achso, du meinst das hier?

    The linker handles an archive file by scanning through it for members which define symbols that have so far been referenced but not defined.
    

  • Mod

    Unter anderem, ja.


Anmelden zum Antworten