Discussion:
(gcc) Linken gegen zwei statische Libs
(zu alt für eine Antwort)
Andreas Pietzowski
2007-05-22 14:14:05 UTC
Permalink
Hallo,

ich habe ein Projekt das mit einem Makefile zwei statische Bibliotheken
(lib1.a und lib2.a) und ein Binary (myapp) erstellt. lib2 benutzt intern
auch noch Dinge, die in lib1 vorhanden sind.

Die libs werden auch beide schön vom make-Prozess erstellt. Wenn ich
allerdings

gcc -o myapp lib1.a lib2.a main.o

aufrufe, dann kommt die Fehlermeldung, dass er wegen undefined references
nicht linken kann. Diese undefinierten Referenzen sind genau die, die lib2
aus lib1 benötigt und im Prinzip auch in lib1 vorhanden sind.

Wennich nun das entsprechende Modul aus lib1.a entpacke und

gcc -o myapp modulauslib1.o lib2.a main.o

aufrufe, dann wird das Binary perfekt erstellt.

An was kann das liegen? Es sollte doch normal egal sein, ob sich ein
Object-File in einer statischen Bibliothek befindet oder als eigenes
Object-File vorhanden ist, oder?

Danke für Hilfe
Andreas
Jochen Lübbers
2007-05-22 15:08:45 UTC
Permalink
Andreas Pietzowski <***@pietzowski.de> schrieb:
[...]
Post by Andreas Pietzowski
Die libs werden auch beide schön vom make-Prozess erstellt. Wenn ich
allerdings
gcc -o myapp lib1.a lib2.a main.o
aufrufe, dann kommt die Fehlermeldung,
[...]

Bei dynamischen Biliotheken ist das auf vielen Plattformen reihenfolge
abhängig. Bei statischen bin ich mir da nicht so sicher.
Probier doch einmal:

gcc -o myapp lib2.a lib1.a main.o

Klappt das?

HTH
Jochen.
--
"Wer die Freiheit aufgibt, um Sicherheit zu gewinnen,
der wird am Ende beides verlieren" (Benjamin Franklin)
Christian Ehrhardt
2007-05-24 11:53:09 UTC
Permalink
Post by Jochen Lübbers
[...]
Post by Andreas Pietzowski
Die libs werden auch beide schön vom make-Prozess erstellt. Wenn ich
allerdings
gcc -o myapp lib1.a lib2.a main.o
aufrufe, dann kommt die Fehlermeldung,
[...]
Bei dynamischen Biliotheken ist das auf vielen Plattformen reihenfolge
abhängig. Bei statischen bin ich mir da nicht so sicher.
Umgekehrt. Bei Shared Libraries ist es aus praktischer Sicht normalerweise
weitgehend egal, in welcher Reihenfolge sie beim Linken angegeben werden. Bei
statisch gelinkten Libraries werden hingegen nur diejenigen Objektdateien aus
dem Archiv (.a) hinzuglinkt, von denen bekannt ist, dass sie gebraucht werden.
Was gebraucht wird, wird von links nach rechts anhand der undefinierten
Referenzen entschieden. Im konkreten Fall waere also folgender Aufruf wohl
richtig:

gcc -omyapp main.o lib2.a lib1.a

Dann ist nach Analyse von main.o klar, welche Teile aus lib2.a benoetigt
werden. Was dann von den aus lib2.a tatsaechlich hinzugelinkten Objektfiles
zusaetzlich an undefinierten Referenzen hinzukommt, wird falls moeglich aus
lib1.a geholt.

Gruesse Christian
--
THAT'S ALL FOLKS!
Loading...