Creazione di un'app a 32 bit in Ubuntu a 64 bit


23

Dopo ore di google, decido di arrendermi e chiederti esperti. Sto cercando di creare un'applicazione a 32 bit (xgap se qualcuno è interessato) nel mio 64 Ubuntu 11.10. Ho aggiunto CFLAGS = -m32 e LDFLAGS = -L / usr / lib32 nel makefile. Gli oggetti sono integrati in 32 bit bene. L'ultimo passo è quello di collegare tutti gli oggetti e le librerie per X windows in questo eseguibile --- xgap. In qualche modo continua a darmi questo errore:

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

Ho installato ia32-libs e supporto mutilib . Penso di dover solo forzare il linker a generare un output i386. Ho provato a inserire due flag LD nel mio comando gcc come mostrato sopra: -melf_i386 e -oformat elf32-i386 . Ma quello che succede è che gcc non cerca più la libreria a 32 bit in / usr / lib32 . Mi chiedo se devo mettere quelle bandiere in un ordine fisso?

Grazie per qualsiasi idea e aiuto!

EDIT: quando aggiungo il flag -m32 nel mio ultimo comando gcc (credo lo stadio di collegamento), anche se ho il flag -L / usr / lib32, gcc non cerca più in / usr / lib32 (davvero strano ...) e genera il seguente errore:

/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

Qualcuno ha idea del perché questo accada? Sto usando lo strumento automatico per configurare e creare. Sono davvero bravo a modificare quei file di script.

EIDT : ho risolto il problema. Penso che gcc si aspettasse un archivio di librerie statiche. Ho usato lo script getlibs da http://ubuntuforums.org/showthread.php?t=474790 per scaricare tutti gli archivi .a necessari per il collegamento. Quindi gcc ha funzionato. Penso che gcc abbia cercato nella directory / usr / lib32 ma non abbia trovato gli archivi .a, quindi ho cercato nella directory standard che è / usr / lib , dove trova i file * .so incompatibili .

Ma allora la domanda è: i file * .so in / usr / lib32 / dal pacchetto ia32-libs non hanno davvero le librerie necessarie per il collegamento? A cosa servono quei file in / usr / lib32 / ?



Risposte:


15

LDFLAGSdovrebbe includere -m32anche. Di seguito dovrebbe funzionare:

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

In effetti, puoi rilasciare -L/usr/lib32parte, poiché questa è una directory predefinita per le librerie a 32 bit e il tuo sistema ne è consapevole.

Fondamentalmente, il modo più semplice per creare un'applicazione a 32 bit su una macchina a 64 bit è:

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

..o alimentare queste variabili per configurare lo script se si utilizzano gli autotools.

AGGIORNARE:

Sembra che tu non abbia familiarità con le differenze nel collegamento con librerie statiche e dinamiche. Cercherò di essere il più minimale possibile:

  • Le librerie di sviluppo statiche e dinamiche hanno la stessa estensione di file .a
  • Se hai installato entrambe le versioni statica e dinamica della stessa libreria, una di esse potrebbe avere postfix aggiuntivo, come libname.aper la libname_s.aversione dinamica e per la versione statica.
  • Sicuramente, le versioni di libreria statica e dinamica differiscono per dimensioni. La versione statica è più pesante.
  • Se si collega con la libreria statica, l'applicazione non ha dipendenze. Se si collega con la libreria dinamica, si baserà sulla .solibreria di runtime che dovrebbe essere presente nel sistema.

Nota, non stiamo parlando di trucchi avanzati qui, come il caricamento esplicito di DSO usando l'API dlopen () / dlsym ().


Ora penso che ci sia qualcosa di sbagliato nella mia configurazione. Ogni volta che aggiungo -m32 nel mio ultimo comando gcc, cerca invece la cartella / usr / lib. Se non aggiungo -m32 e utilizzo il flag -L / usr / lib32, cerca la directory corretta ma genera gli errori sopra. Sai cosa potrebbe causare questo?
Rich

E cosa succederà se si combinano entrambi (come nel mio esempio sopra)?
Andrejs Cainikovs,

se li combino entrambi, non cerca ancora in / usr / lib32. cerca solo in / usr / lib. E a proposito, sto usando strumenti automatici.
Rich

Strano .. Hai provato a nutrirti -l/usr/lib32/libXaw.soinvece?
Andrejs Cainikovs,

Non li trova ....: 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: impossibile trovare -l / usr / lib32 / libXaw.so
Rich

9

Stavo ricevendo errori come:

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

Questo mi ha risolto:

sudo apt-get install g++-multilib

se stai usando un pacchetto gcc diverso da quello predefinito (ad es. gcc-7), dovrai installare il pacchetto per quella versione specifica:

sudo apt-get install g++-7-multilib

1
g++-multilibè per g ++ (C ++), per gcc (C) è necessario anche gcc-multilib.
pevik,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.