Libraries zusammenlinken klappt nicht
-
Hallo zusammen,
ich habe c-Files beim compilieren gruppiert und statische libraries erzeugt.
Jetzt habe ich drei libraries A,B und C.
In C ist aber eine Funktion die Funktionen von A und B aufruft.Leider bekomme ich beim finalen Linken:
gcc -o main.bin main.o -LcompA -LcompB -LcompC -lcompA -lcompB -lcompC compC/libcompC.a(compC.o): In function `compC_wwww': compC.c:(.text+0x16): undefined reference to `compA_xxxx' compC.c:(.text+0x1f): undefined reference to `compB_yyyy' collect2: ld gab 1 als Ende-Status zurück
Wieso kann er die Symbole nicht auflösen?
Wenn ich mit nm in A und B reinschau sehe ich diese jedenfalls.
-
Ich habe eine Lösung:
Man muss C beim Aufruf vor A und B angeben, dann gehts.
Weiss jemand warum?
Ich halte das für ungeschickt mich beim Linken um Abhängigkeiten kümmern zu müssen wenn ich soweiso alles angebe. Warum wird nicht alles eingelesen und dann erst geschaut ob was fehlt?
-
http://gcc.gnu.org/onlinedocs/gcc/Link-Options.html
Warum? - da musste die Entwickler fragen
Ach so ja - das Thema sollte wohl eher ins Compiler Forum.
-
Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C (C89 und C99) in das Forum Compiler- und IDE-Forum verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
stefan-tiger schrieb:
Ich halte das für ungeschickt mich beim Linken um Abhängigkeiten kümmern zu müssen wenn ich soweiso alles angebe. Warum wird nicht alles eingelesen und dann erst geschaut ob was fehlt?
Is auch ungeschickt. C (und C++) ist eben doch eher Steinzeit. Bei moderneren Sprachen wie C# oder Java ist das völlig unwichtig.
-
Die Reihenfolge ist deshalb wichtig, weil es damit möglich ist, daß mehrere gleiche Funktionen in verschiedenen Object-Dateien vorkommen können und dann entsprechend die erste nur gelinkt wird.
Ich erinnere mich, daß auf einigen Plattformen (Amiga, Unix, ...) die Linkerreihenfolge immer "-lm -lc" sein mußte (und nicht umgekehrt), da die Mathelib die "printf"/"scanf"-Funktion um die Floatingpoint-Parameter ("%e", "%f", "%g") erweitert hat (sonst wären immer nur die Standard-Funktionen aus der C-Lib gelinkt worden).
-
Th69 schrieb:
Die Reihenfolge ist deshalb wichtig, weil es damit möglich ist, daß mehrere gleiche Funktionen in verschiedenen Object-Dateien vorkommen können und dann entsprechend die erste nur gelinkt wird.
...Hallo,
ich hab die Erfahrung gemacht, dass wenn mehrere gleiche "Symbole" beim linken enthalten sind, der Linker deshalb abbricht, weil er gerade nicht weiss welches er nehmen soll.
-
Hallo Stefan,
da scheint es unterschiedliche Strategien bei den verschiedenen Linkern zu geben, s.a.
http://stackoverflow.com/questions/4643192/why-im-not-getting-multiple-definition-error-from-the-gUnd der Linker ld (beim gcc) kennt wohl auch das Unterdrücken der Fehlermeldung mittels des "--allow-multiple-definition" Schalters: http://www.delorie.com/gnu/docs/binutils/ld_3.html
Aber beim MSVC kenne ich auch die "... is already defined in ..."-Fehlermeldung (und leider kein Flag zum Abschalten...).