2009-03-28 9 views
1

Ich habe eine Oracle-Datenbank und eine Oracle-HTTP-Server-Installation von einer 32-Bit-Maschine auf eine 64-Bit-Maschine migriert - beide Maschinen unter Linux. Oracle Database ist 64-Bit, aber der (Apache) HTTP-Server ist 32-Bit.Können Sie 32-Bit-Apache-DSOs (Oracle HTTP Server) auf einer 64-Bit-Maschine kompilieren?

Ich verwende einige Nicht-Oracle-DSOs (mod_ntlm für einen), aber immer wenn ich den Standard "make install" -Typ tue, lande ich mit einem 64-Bit-Modul.

Gibt es eine Standardmethode zum Kompilieren von 32-Bit-Apache-Modulen auf einer 64-Bit-Maschine?

+0

Siehe auch http://stackoverflow.com/questions/1272357/how-to-compile-a-32-bit-binary-on-a-64-bit-linux-machine-with-gcc-cmake – Raedwald

Antwort

5

Als Alternative zu Andrew Medico Antwort, verwenden Sie '-m32' für 32-Bit-Compilations und '-m64' für 64-Bit-Compilations auf PPC oder SPARC oder Intel-Maschinen - da Sie Erwähnen Sie nicht wirklich, welche Chip-Architektur Sie verwenden und dass die Notation auf all diesen funktioniert.

benutze ich oft:

CC="gcc -m32" ./configure 

eine 32-Bit-Zusammenstellung zu gewährleisten (oder, häufiger, CC="gcc -m64" 64-Bit-Zusammenstellung zu gewährleisten).


Frage: "Ist CC eine Umgebungsvariable, die von make verwendet wird?"

Antwort: Ja, obwohl in diesem Fall auch von configure erkannt wird, das ist ein Shell-Skript, das von autoconf generiert wird. Die Notation, die ich verwendet habe - was ich an der Befehlszeile verwende - setzt CC in der Umgebung, während der Befehl configure ausgeführt wird. Die andere Antwort schlägt vor mit:

./configure CC="gcc -m32" 

Ich nehme an, dass funktioniert und erreicht viel den gleichen Effekt; Ich habe es nicht versucht, also weiß ich nicht, dass es funktioniert. Wenn Sie ./configure --help | less ausführen, werden Informationen (oft nur Standardinformationen) zur Verwendung des Skripts angezeigt. Und am Ende wird es (einige der) relevante Umgebungsvariablen auflisten, von denen CC eins ist.

Der Vorteil der Einstellung des C-Compilers auf "gcc-m32" besteht darin, dass das 32-Bit-Flag jedes Mal gesetzt wird, wenn der Compiler verwendet wird - es gibt sehr wenig Spielraum für einen Fehler. Wenn Sie eine Flags-Variable (CFLAGS, usw.) setzen, besteht die Möglichkeit, dass ein Befehl sie nicht verwendet, und dann können die Dinge schief gehen.

Auch zurück zur Frage verwendet make sicherlich eine Variable (Makro) namens CC. Und Sie können das in der make-Befehlszeile einstellen:

Das überschreibt jede Einstellung im Makefile. Wenn Sie dagegen eine Umgebungsvariable verwenden, überschreibt die Einstellung im Makefile den Wert in der Umgebung. Daher ist es weniger hilfreich, CC als Umgebungsvariable festzulegen. Obwohl der Umgebung Vorrang vor dem Makefile gibt, ist es normalerweise eine gefährliche Option zu verwenden - es kann unerwartete Nebenwirkungen haben.

3
./configure CFLAGS="-march=i686" 

sollte es tun

+0

didn arbeite nicht für mich. –

2

Zusammen mit dem Flag -m32 in gcc müssen Sie möglicherweise das Flag -melf_i386 für ld einfügen, um die 32-Bit-Objektdateien ordnungsgemäß mit den 32-Bit-Bibliotheken zu verknüpfen, wenn Sie sowohl die 32-Bit- als auch die 64-Bit-Bibliotheken haben.Die Standard-ld auf 64-Bit-Linux-Boxen wird standardmäßig zu den 64-Bit-Bibliotheken und Sie erhalten einen Kompatibilitätsfehler, wenn die Verknüpfung auftritt.