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.



  • @antamauna:

    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. ]



  • @antamauna:

    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.


Anmelden zum Antworten