neues Linux, alte Lib



  • Nachdem ich auf meinem Rechner Ubuntu 5.04 durch SuSE 10.0 ersetzt habe, erhalte ich beim Kompilieren meiner eigenen Applikation (genauer gesagt beim Linken mit einer älteren Bibliothek) folgende Fehlermeldung:

    /usr/lib64/gcc/x86_64-suse-linux/4.0.2/../../../../x86_64-suse-linux/bin/ld:
      skipping incompatible /usr/openwin/lib/libxview.so when searching for -lxview
    

    Weiß jemand, was hier mit "incompatible" gemeint ist? Die gleiche Bibliothek (gleiches Binary) konnte ich unter Ubuntu-Linux auf dem gleichen Rechner problemlos linken.

    Kann es daran liegen, dass SuSE-Linux automatisch den Kernel und die Libs für ein Athlon Dual-Core Prozessor installiert hat, während Ubuntu die Standard Intel-386-Binaries verwendet hat? Ist es etwa nicht möglich, auf einem Multiprozessor-System 386-Binaries zu verwenden, oder liegt es vielleicht am C-Compiler/Linker?

    Bin für jeden Tipp dankbar.



  • Wenn ich das richtig sehe, compilierst du dein Programm als 64Bit Anwendung. Vielleicht ist libxview.so eine 32Bit Library.



  • Benutzt du Binaries die du unter Ubuntu kompiliert hast weiter? Das dürfte das Problem sein.



  • ProgChild schrieb:

    Wenn ich das richtig sehe, compilierst du dein Programm als 64Bit Anwendung. Vielleicht ist libxview.so eine 32Bit Library.

    Die libxview.so ist höchstwahrscheinlich eine 32-Bit-Library - die habe ich nämlich selbst auf einem anderen System kompiliert (seit SuSE 9.3 ist sie aus der Distribution herausgeflogen).

    Verstehe ich das richtig: Liegt das Problem darin, dass der Compiler ein 64-Bit-Binary erstellen will und dazu keine 32-Bit-Library linken kann?
    In diesem speziellen Fall kann ich die libxview auf dem neuen System neu kompilieren, aber wenn man die Möglichkeit nicht hätte, wie könnte ich den Compiler dazu bringen, halt nur ein 32-Bit-Binary zu erzeugen?



  • -m32



  • @....._.:
    Danke! Ich bin gestern Nacht aber auch noch selbst darauf gekommen.

    kingruedi schrieb:

    Benutzt du Binaries die du unter Ubuntu kompiliert hast weiter? Das dürfte das Problem sein.

    Das ist Quatsch. Die alten Binaries funktionieren natürlich noch. Dazu installiert SuSE bei einer 64-Bit-Maschine zusätzlich auch die 32-Bit-Libraries (in /usr/lib während die 64-Bit-Libraries in /usr/lib64 liegen).



  • Der Thread ist schon etwas älter aber meine Frage passt zu dem Thema

    @Martin G
    Bei mir wird jeder Versuch 32bit Programme (mit -m32 flag) zu erstellen konsequent mit:

    /usr/lib64/gcc/x86_64-suse-linux/4.0.2/../../../../x86_64-suse-linux/bin/ld: skipping incompatible /usr/lib64/gcc/x86_64-suse-linux/4.0.2/../../../libc.so when searching for -lc
    /usr/lib64/gcc/x86_64-suse-linux/4.0.2/../../../../x86_64-suse-linux/bin/ld: skipping incompatible /usr/lib64/gcc/x86_64-suse-linux/4.0.2/../../../libc.a when searching for -lc
    /usr/lib64/gcc/x86_64-suse-linux/4.0.2/../../../../x86_64-suse-linux/bin/ld: skipping incompatible /usr/lib64/libc.so when searching for -lc
    /usr/lib64/gcc/x86_64-suse-linux/4.0.2/../../../../x86_64-suse-linux/bin/ld: skipping incompatible /usr/lib64/libc.a when searching for -lc
    /usr/lib64/gcc/x86_64-suse-linux/4.0.2/../../../../x86_64-suse-linux/bin/ld: cannot find -lc

    quittiert. Dabei ist libc auf jeden Fall vorhanden (in /lib/libc.so.6).
    Das Verzeichnis mit -L/lib/ hinzufügen oder die Library direkt mit /lib/libc.so.6 im gcc Aufruf helfen auch nicht.
    Mein Systemist auch SuSE 10.0 64bit.

    Könntest du genauer beschreiben wie es dir gelungen ist Programme als 32bit Version zu kompilieren ?

    Wäre dankbar für jede Hilfe.



  • Hast du keine 32Bit libc installiert?



  • Also ich habe das Packet glibc-32bit instaliert und im Verzeichnis /lib/ (Verzeichnis mit 32bit libs, /lib64/ ist für 64bit libs) findet man auch libc.so.6. Ob das nun wirklich eine 32bit lib ist, bin ich mir allerdings nicht sicher.



  • Marcin schrieb:

    @Martin G
    Könntest du genauer beschreiben wie es dir gelungen ist Programme als 32bit Version zu kompilieren ?

    Wäre dankbar für jede Hilfe.

    Ich habe eigentlich nur "-m32" ergänzt, aber ich werde dir mal das Makefile posten (ich arbeite hier gerade unter WinXP, deshalb kann ich es nicht sofort einfügen).

    Marcin schrieb:

    Also ich habe das Packet glibc-32bit instaliert und im Verzeichnis /lib/ (Verzeichnis mit 32bit libs, /lib64/ ist für 64bit libs) findet man auch libc.so.6. Ob das nun wirklich eine 32bit lib ist, bin ich mir allerdings nicht sicher.

    Das ist ganz einfach: Mit dem Kommando "file":

    file /usr/lib/libc.so.[i]xxxxx[/i]
    


  • Danke für die Antwort.

    Ich wusste nicht dass file auch das kann.
    Die libc.so.6 ist auf jeden Fall eine 32bit lib (genauer gesagt ist libc.so.6 link auf libc-2.3.5.so aber das spielt wohl egal) .
    Jeder Versuch gegen diese Lib zu linken misslingt leider.



  • Hier ein Makefile, wie es bei mir funktioniert:

    ARCH=-m32
    
    xdams:          xdams.o gui.o audio.o chirp.o dft.o
                    gcc $(ARCH) -L/usr/X11/lib -L/usr/openwin/lib -lX11 -lxview \
                      -lolgx -lm -o xdams xdams.o gui.o audio.o chirp.o dft.o
    
    xdams.o:        xdams.c gui.h
                    gcc $(ARCH) -Wall -c xdams.c
    
    gui.o:          gui.c audio.h dft.h chirp.h play.icon loop.icon stop.icon \
                      zero.icon setup.icon save.icon print.icon help.icon quit.icon
                    gcc $(ARCH) -Wall -I/usr/openwin/include -I/usr/X11/include -c gui.c
    
    audio.o:        audio.c chirp.h
                    gcc $(ARCH) -Wall -c audio.c
    
    chirp.o:        chirp.c
                    gcc $(ARCH) -Wall -c chirp.c
    

    Und hier die Liste der bei mir installierten Pakete, die mit der libc zu tun haben:

    > rpm -q -a | fgrep libc
    glibc-i18ndata-2.3.5-40
    glibc-locale-2.3.5-40
    klibc-utils-1.0.14-14
    glibc-devel-2.3.5-40
    klibc-1.0.14-14
    glibc-2.3.5-40
    libcap-1.92-487
    glibc-locale-32bit-2.3.5-40
    libcdio-32bit-0.75-3
    libcom_err-1.38-4
    libcroco-0.6.0-10
    glibc-devel-32bit-2.3.5-40
    libcap-32bit-1.92-487
    libcddb-1.2.1-2
    glibc-info-2.3.5-40
    libcddb-32bit-1.2.1-2
    glibc-32bit-2.3.5-40
    libcom_err-32bit-1.38-4
    libcroco-32bit-0.6.0-10
    libcdio-0.75-3
    

    Ich könnte mir vorstellen, dass bei dir das Paket "glibc-devel-32bit" fehlt.

    Viel Erfolg!



  • Hallo.
    Das Paket "glibc-devel-32bit" hatte ich auch installiert gehabt.
    Ich habe zwar mittlerweile das Problem gelöst, allerdings ohne festgestellt zu haben was die Ursache für dieses Problem ist.

    Nach dem ich gemerkt hatte dass es auch nicht möglich war gegen 32bit-Version von glib etwas zulinken, habe ich alle Pakete die man im Yast in der Kategorie "C/C++ Compiler und Werkzeuge" findet, neu installiert, und es hat erstaunlicherweise geholfen.
    Es reicht tatsächlich nur die Option "-m32" zuübergeben und schon werden 32bit Executables erstellen.

    Ich bedanke mich für die Antworten.


Log in to reply