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?



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 ().


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

1
g++-multilibist für g ++ (C ++), für gcc (C) brauchst du auch gcc-multilib.
— Pevik
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.