Erstellen einer 32-Bit-App in 64-Bit-Ubuntu

23

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?

Reich
quelle

Antworten:

15

LDFLAGSsollte auch enthalten -m32. Folgendes sollte funktionieren:

export LDFLAGS='-m32 -L/usr/lib32'

Tatsächlich können Sie einen -L/usr/lib32Teil 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:

export CFLAGS='-m32'
export CXXFLAGS='-m32'
export LDFLAGS='-m32'
make

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

  • Sowohl statische als auch dynamische Entwicklungsbibliotheken haben dieselbe Dateierweiterung .a
  • Wenn Sie sowohl statische als auch dynamische Versionen derselben Bibliothek installiert haben, verfügt eine davon möglicherweise über ein zusätzliches Postfix, z. B. libname.afür die dynamische und die libname_s.astatische Version.
  • Sicher, statische und dynamische Bibliotheksversionen unterscheiden sich in der Größe. Statische Version ist schwerer.
  • Wenn Sie eine Verknüpfung mit einer statischen Bibliothek herstellen, weist Ihre Anwendung keine Abhängigkeiten auf. Wenn Sie eine Verknüpfung mit einer dynamischen Bibliothek herstellen, ist diese auf die .soLaufzeitbibliothek 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 ().

Andrejs Cainikovs
quelle
Jetzt denke ich, dass mit meinem Setup etwas nicht stimmt. Immer wenn ich in meinem letzten gcc-Befehl -m32 hinzufüge, durchsucht es stattdessen den Ordner / usr / lib. Wenn ich -m32 nicht hinzufüge und das Flag -L / usr / lib32 verwende, wird das richtige Verzeichnis durchsucht, die obigen Fehler werden jedoch generiert. Wissen Sie, woran das liegen könnte?
Rich
Und was passiert, wenn Sie beide kombinieren (wie in meinem obigen Beispiel)?
Andrejs Cainikovs
Wenn ich beides kombiniere, wird immer noch nicht in / usr / lib32 gesucht. es sucht nur in / usr / lib. Und übrigens benutze ich Auto-Tools.
Rich
Seltsam .. Hast du -l/usr/lib32/libXaw.sostattdessen versucht zu füttern ?
Andrejs Cainikovs
Es kann sie nicht finden ....: gcc -o xgap xcmds.o utils.o gapgraph.o gaptext.o pty.o popdial.o xgap.o selfile.o -O2 -L / usr / lib32 -l / usr / lib32 / libXaw.so -l / usr / lib32 / libXmu.so -l / usr / lib32 / libXt.so -l / usr / lib32 / libXext.so -l / usr / lib32 / libX11.so -l / usr / lib32 / libSM.so -l / usr / lib32 / libICE.so -m32 / usr / bin / ld: -l / usr / lib32 / libXaw.so kann nicht gefunden werden
Rich
9

Ich bekam Fehler wie:

/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.8/libstdc++.so when searching for -lstdc++

Das hat es für mich behoben:

sudo apt-get install g++-multilib

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:

sudo apt-get install g++-7-multilib
Vladimir Panteleev
quelle
1
g++-multilibist für g ++ (C ++), für gcc (C) brauchst du auch gcc-multilib.
Pevik