2009-11-04 13 views
10
zu berühren

Die Lösung inWie ein 32-Bit-Binär auf einem 64-Bit-Linux-Rechner kompilieren, ohne die CFLAGS Umgebungsvariable

How to compile a 32-bit binary on a 64-bit linux machine with gcc/cmake

nicht möglich ist, weil ich 3rd-Party-Software und andere Sachen zu benutzen, die ist bereits mit der CFLAGS-Variable. Und ihre Makefiles zu patchen ist nicht erlaubt - sagt mein Chef.

Also muss ich einen anderen Weg finden, um es durchzusetzen. Vielleicht eine Magie mit symbolischen Links, die einen Aufruf von gcc an eine 32-Bit-Version des Compilers umleiten (in der Hoffnung, dass das Standardziel nicht dynamisch erkannt wird).

+0

Ist diese "3rd-Party-Software und andere Sachen" eine Abhängigkeit, die beim Erstellen Ihrer 32-Bit-Binärdatei ebenfalls kompiliert werden muss? –

Antwort

14

Sie dürfen CFLAGS in Ihrer Umgebung nicht ändern, aber gibt es einen Grund, warum Sie es nicht vorübergehend für den Build überschreiben können?

Für ein Autotool-basiertes Paket, würde ich zuerst versuchen:

CFLAGS="-m32" ./configure [opts] 
make 
make install 

Eine gut geschriebene configure.ac Datei soll, um es Ihre Variablen CFLAGS und fügen Sie respektieren, ohne dass Sie die Paketquelle zu ändern.

aktualisieren

Unter der Annahme, dann, dass Sie nicht Ihre CC Variable neu definieren kann, entweder, ich würde ein paar Weg Tricks spielen. Machen Sie ein Shell-Skript in ${HOME}/gcc32 genannt gcc mit folgendem (ungetestet):

#!/bin/sh 
/usr/bin/gcc -m32 "[email protected]" 

Dann prepend dies auf Ihrem Weg, wenn Sie 32-Bit aufbauen wollen:

export PATH=${HOME}/gcc32:${PATH} 

Offensichtliche Modifikationen unterstützen g++, icc oder ein anderer Compiler.

+0

Leider setzt das Makefile selbst CFLAGS und noch schlimmer, es basiert auf einer Kaskade von If-Bedingungen. Daher kann ich dies nicht ohne weiteres in meine CFLAGS-Definition einbeziehen. Der Makefile-Schreiber sollte einen anderen Variablennamen verwendet haben und CFLAGS für seinen beabsichtigten Zweck verlassen haben, aber dies ist der Code, wie er ist. – Lothar

+0

Diese neue Information wurde in das obige Update integriert – jvasak

+0

Sie müssen einen absoluten Pfad verwenden, sonst erhalten Sie eine unendliche Rekursion. –

2

Angenommen, gcc und Freunde befinden sich in "/ usr/bin". Nehmen wir an, Sie haben einen Ordner namens "~/.local/bin", der sich in Ihrem Pfad befindet.

 
#! /bin/bash 
/usr/bin/gcc -m32 [email protected] 

Sie können einen "g ++" Skript mit dem Inhalt in ähnlicher Weise wie folgt erstellen: Sie können ein Bash-Skript namens "gcc" in "~/.local/bin" wie schaffen

 
#! /bin/bash 
/usr/bin/g++ -m32 [email protected] 

Grundsätzlich tun Sie dies für "C++", "CC", "wie", "ld", etc. nach Bedarf. Machen Sie die Skripte ausführbar. Stellen Sie sicher, dass sich "~/.local/bin" in Ihrer PATH-Umgebungsvariablen BEFORE "/ usr/bin" befindet. Wenn dies der Fall ist, werden die Skripte aufgerufen, wenn das Makefile den Compiler aufruft (vorausgesetzt, dass sie relative Pfade verwendet haben).

+1

Verwenden Sie "$ @" (mit Anführungszeichen), um sicherzustellen, dass Leerzeichen in Argumenten korrekt behandelt werden. – coppit

Verwandte Themen