Nach stundenlangem googeln entscheide ich mich, aufzugeben und euch Experten zu fragen. Ich versuche, eine 32-Bit-Anwendung (xgap, wenn jemand interessiert) in meinem 64 Ubuntu 11.10 zu erstellen. Ich habe die CFLAGS = -m32 und die LDFLAGS = -L / usr / lib32 in das Makefile eingefügt . Die Objekte sind in 32 Bit fein eingebaut. Der letzte Schritt ist das Verknüpfen aller Objekte und Bibliotheken für X-Fenster mit dieser ausführbaren Datei --- xgap. Irgendwie gibt es mir immer wieder diesen Fehler:
gcc -o xgap xcmds.o utils.o gapgraph.o gaptext.o pty.o popdial.o xgap.o selfile.o -L/usr/lib32 -lXaw -lXmu -lXt -lXext -lX11 -lSM -lICE
/usr/bin/ld: skipping incompatible /usr/lib32/libXmu.so when searching for -lXmu
...
/usr/bin/ld: i386 architecture of input file `xcmds.o' is incompatible with i386:x86-64 output
...
Ich habe die Unterstützung für ia32-libs und mutilib installiert . Ich denke, ich muss nur den Linker zwingen, eine i386-Ausgabe zu generieren. Ich habe versucht, zwei ld- Flags in meinen gcc-Befehl einzufügen, wie oben gezeigt: -melf_i386 und -oformat elf32-i386 . Was aber passiert ist, dass gcc nicht mehr nach der 32-Bit-Bibliothek in / usr / lib32 sucht . Ich frage mich, ob ich diese Flags in eine feste Reihenfolge bringen muss.
Vielen Dank für jede Idee und Hilfe!
BEARBEITEN: Wenn ich in meinem letzten gcc-Befehl das -m32-Flag hinzufüge (die Verknüpfungsstufe, glaube ich), sucht gcc nicht mehr in / usr / lib32 (wirklich), selbst wenn ich das -L / usr / lib32-Flag an der richtigen Stelle habe seltsam ...) und erzeugt den folgenden Fehler:
/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.6.1/../../../libXaw.so when searching for -lXaw
/usr/bin/ld: skipping incompatible /usr/lib/libXaw.so when searching for -lXaw
/usr/bin/ld: cannot find -lXaw
collect2: ld returned 1 exit status
Hat jemand eine Idee, warum das passiert? Ich benutze das Auto-Tool, um zu konfigurieren und zu machen. Ich bin wirklich gut darin, diese Skriptdateien zu modifizieren.
EIDT : Ich habe das Problem gelöst. Ich glaube, dass gcc ein statisches Bibliotheksarchiv erwartet hat. Ich habe das Skript getlibs von http://ubuntuforums.org/showthread.php?t=474790 verwendet , um alle zum Verknüpfen erforderlichen .a-Archive herunterzuladen. Dann hat gcc funktioniert. Ich denke, dass gcc im Verzeichnis / usr / lib32 gesucht hat , aber die .a- Archive nicht gefunden hat, und deshalb im Standardverzeichnis / usr / lib gesucht hat , wo es die inkompatiblen * .so- Dateien findet.
Aber dann ist die Frage: Die * .so- Dateien in / usr / lib32 / aus dem Paket ia32-libs haben nicht wirklich die Bibliotheken, die zum Verknüpfen benötigt werden? Wofür werden diese Dateien in / usr / lib32 / verwendet?
Antworten:
LDFLAGS
sollte auch enthalten-m32
. Folgendes sollte funktionieren:Tatsächlich können Sie einen
-L/usr/lib32
Teil löschen , da dies ein Standardverzeichnis für 32-Bit-Bibliotheken ist, und Ihr System ist sich dessen bewusst.Grundsätzlich ist die einfachste Möglichkeit, eine 32-Bit-Anwendung auf einem 64-Bit-Computer zu erstellen:
..oder füttern Sie diese Variablen, um das Skript zu konfigurieren, wenn Sie Autotools verwenden.
AKTUALISIEREN:
Scheint, als ob Sie die Unterschiede bei der Verknüpfung mit statischen und dynamischen Bibliotheken nicht wirklich kennen. Ich werde versuchen so minimal wie möglich zu sein:
.a
libname.a
für die dynamische und dielibname_s.a
statische Version..so
Laufzeitbibliothek angewiesen , die in Ihrem System vorhanden sein sollte.Bitte beachten Sie, dass wir hier nicht über fortgeschrittene Tricks sprechen, wie das explizite Laden von DSOs mit der API dlopen () / dlsym ().
quelle
-l/usr/lib32/libXaw.so
stattdessen versucht zu füttern ?Ich bekam Fehler wie:
Das hat es für mich behoben:
Wenn Sie ein anderes gcc-Paket als das Standardpaket verwenden (z. B.
gcc-7
), müssen Sie das Paket für diese bestimmte Version installieren:quelle
g++-multilib
ist für g ++ (C ++), für gcc (C) brauchst du auchgcc-multilib
.