Statisches Compilieren mit gcc
-
Moin, Moin...
Ich schreibe zurzeit eine Anwendung unter UNIX(in C mit gcc), die Zugriff auf die Oracle-Datenbank hat. Wenn ich die Anwendung mit shared object libraries linke(ist wohl der Default-Zustand), dann funktioniert es auch prima. Nun muss die Anwendung aber statisch gelinkt werden. Dabei erhalte ich Fehlermeldungen in rauen Mengen.
Shared:
gcc -o projektname -L $(ORALIBS1) -L$(ORALIBS2) object1.o object2.o -lclntsh
Das läuft ohne Probleme.
Statisch:
gcc -o projektname -L $(ORALIBS1) -L$(ORALIBS2) object1.o object2.o -static -lclntst8
Dabei erhalte ich z.B. folgende Fehlermeldungen:
log10 (Oracle-Lib-Pfad)/libclntst8.a(np.o) dlopen (Oracle-Lib-Pfad)/libclntst8.a(slpmloc.o) . . .
Die Liste umfasst etwa 30 Einträge.
Wie kann ich das Ganze nu' statisch linken? Hat jemand einen Vorschlag????
Danke im voraus...
-
Original erstellt von Kal El:
**
Dabei erhalte ich z.B. folgende Fehlermeldungen:
[code]
log10 (Oracle-Lib-Pfad)/libclntst8.a(np.o)
dlopen (Oracle-Lib-Pfad)/libclntst8.a(slpmloc.o)
.
.
Danke im voraus...**das ist doch bestimmt nicht der ganze output von gcc.
was sagt der denn noch ??ein dlopen ist bei statischen binaries irgendwie fehl am platz,
finde ich.eventuell musst du deine Oracle libs vorher auch mal statisch bauen, wenn
die nämlich dynamische anteile haben, kann das nicht funktionieren.
-
Herzlichen Danke für Deine Antwort. Die komplette Ausgabe von gcc lautet:
Undefined first referenced symbol in file socket /(Pfadangabe)/lib/libclntst8.a(ntt.o) aiocancel /(Pfadangabe)/lib/libclntst8.a(skgfr.o) getpeername /(Pfadangabe)/lib/libclntst8.a(ntt.o) recv /(Pfadangabe)/lib/libclntst8.a(ntt.o) dlclose /(Pfadangabe)/lib/libclntst8.a(slpmfpb.o) aiowait /(Pfadangabe)/lib/libclntst8.a(skgfr.o) gethostbyname /(Pfadangabe)/lib/libclntst8.a(sepcs.o) accept /(Pfadangabe)/lib/libclntst8.a(ntt.o) gethostbyname_r /(Pfadangabe)/lib/libclntst8.a(snlpc.o) log /(Pfadangabe)/lib/libclntst8.a(lnxln.o) send /(Pfadangabe)/lib/libclntst8.a(ntt.o) bind /(Pfadangabe)/lib/libclntst8.a(ntt.o) log10 /(Pfadangabe)/lib/libclntst8.a(np.o) setsockopt /(Pfadangabe)/lib/libclntst8.a(ntt.o) getdomainname /(Pfadangabe)/lib/libclntst8.a(snnfh.o) h_errno /(Pfadangabe)/lib/libclntst8.a(sntt.o) sqrt /(Pfadangabe)/lib/libclntst8.a(lnxsqr.o) sendmsg /(Pfadangabe)/lib/libclntst8.a(sntpass.o) getsockopt /(Pfadangabe)/lib/libclntst8.a(ncrss.o) recvmsg /(Pfadangabe)/lib/libclntst8.a(sntpass.o) aioread /(Pfadangabe)/lib/libclntst8.a(skgfr.o) inet_addr /(Pfadangabe)/lib/libclntst8.a(sgslun.o) getservent_r /(Pfadangabe)/lib/libclntst8.a(snlpc.o) sendto /(Pfadangabe)/lib/libclntst8.a(ntt.o) gethostent_r /(Pfadangabe)/lib/libclntst8.a(snlpc.o) inet_ntoa /(Pfadangabe)/lib/libclntst8.a(sntvl.o) getsockname /(Pfadangabe)/lib/libclntst8.a(ntt.o) aiowrite /(Pfadangabe)/lib/libclntst8.a(skgfr.o) gethostbyaddr_r /(Pfadangabe)/lib/libclntst8.a(snlpc.o) dlsym /(Pfadangabe)/lib/libclntst8.a(slpmloc.o) dlopen /(Pfadangabe)/lib/libclntst8.a(slpmloc.o) dladdr /(Pfadangabe)/lib/libclntst8.a(sskgds.o) dlerror /(Pfadangabe)/lib/libclntst8.a(sskgds.o) recvfrom /(Pfadangabe)/lib/libclntst8.a(ntt.o) getservbyname_r /(Pfadangabe)/lib/libclntst8.a(snlpc.o) listen /(Pfadangabe)/lib/libclntst8.a(ntt.o) getservbyport_r /(Pfadangabe)/lib/libclntst8.a(snlpc.o) connect /(Pfadangabe)/lib/libclntst8.a(ntt.o) ld: fatal: Symbol referencing errors. No output written to logbook collect2: ld returned 1 exit status make: Fatal error: Command failed for target `logbook'
Zum statischen Linken benutze ich auch die statischen Bibliotheken. In dem Verzeichnis lib sind beide Arten enthalten.
Ciao...
[ Dieser Beitrag wurde am 13.03.2003 um 15:44 Uhr von Kal El editiert. ]
-
Original erstellt von Kal El:
**
Undefined first referenced
symbol in file
socket /(Pfadangabe)/lib/libclntst8.a(ntt.o)
aiocancel /(Pfadangabe)/lib/libclntst8.a(skgfr.o)
getpeername /(Pfadangabe)/lib/libclntst8.a(ntt.o)...
**
ah da kann man schon mehr mit anfangen...
also so wie das aussieht kann der linker diese ganzen symbole nicht
auflösen, weil entweder die entsprechende lib fehlt, dann musst du die
dazulinken, oder weil die reihenfolge der dazugelinkten libs nicht in
ordnung ist (die reihenfolge kann beiweilen wichtig sein).dlopen, dlerror etc sind in der libdl also pack doch mal noch ein -ldl
hintendran ( less /usr/lib/libdl.a -> da stehen die symbole )die anderen symbole sollten eigentlich in der libc.a drinstecken:
also mal noch ein -lc angehangen.wenn die reihen folge entscheidend ist hilft:
gcc -Wl,--startgroup foo.o bar.o -Wl,--endgroup
siehe auch man ld und man gcc
ach ja und der pfad zu diesen libs sollte natürlich auch mit angegeben sein:
-L/pfad/zur/lib
[ Dieser Beitrag wurde am 14.03.2003 um 12:49 Uhr von antamauna editiert. ]
-
Nochmals danke. Nun funktioniert es auch. Schade bloß, dass das Programm nun schlappe 5,5 MB groß ist(nach strip).
Ciao...
-
Original erstellt von Kal El:
**@antamauna:Nochmals danke. Nun funktioniert es auch. Schade bloß, dass das Programm nun schlappe 5,5 MB groß ist(nach strip).
Ciao...**
tja das ist der preis fürs statisch linken.
mein binary hier ist noch grösser aber da stecken eigentlich auch drei
programme drin ...freut mich, dass die tipps geholfen haben.