[Gcc] Incompatibilità con l'output i386
ciao, ho il seguente problema:
sto facendo un esercizio x l'esame di c++:
questo è il codice:
la funzione stampa_matrice si trova in stampamatrice.o ed è dichiarata in stampamatrice.h.
Ho provato a compilare da terminale e ho ottenuto un errore:
è perchè il file .o da me linkato è stato compilato su una macchina a 64bit e il mio è a 32?
ho provato ad usare la mia stampa:
e sembra funzionare
sto facendo un esercizio x l'esame di c++:
questo è il codice:
using namespace std; #include <iostream> #include <fstream> #include "stampamatrice.h" const int NUMERO_RIGHE = 6; const int NUMERO_COLONNE = 5; bool controlla(int riga, int colonna, int righe, int colonne); char **seleziona(char matrice[][NUMERO_COLONNE], int riga, int colonna, int righe, int colonne); char **alloca_matrice(int righe, int colonne); void dealloca_matrice(char **matrice, int righe); int main (){ char matrice[][NUMERO_COLONNE]={ {'a', 'b', 'c', 'd', 'e'}, {'f', 'g', 'h', 'i', 'j'}, {'k', 'l', 'm', 'n', 'o'}, {'p', 'q', 'r', 's', 't'}, {'u', 'v', 'w', 'x', 'y'}, {'z', '+', '-', '*', '/'}}; int nriga, ncolonna, nrighe, ncolonne; cout << "Prima riga e colonna: "; cin >> nriga >> ncolonna; cout << "Numero righe e colonne: "; cin >> nrighe >> ncolonne; char **selezione = seleziona(matrice, nriga, ncolonna, nrighe,ncolonne); stampa_matrice(selezione, nrighe, ncolonne); } char **seleziona(char matrice[][NUMERO_COLONNE], int riga, int colonna, int righe, int colonne){ char **selezione = alloca_matrice(righe, colonne); for(int i=0; i<righe; i++) for(int j=0; j<colonne; j++) selezione[i][j] = matrice[riga+i][colonna+j]; return selezione; } char **alloca_matrice(int righe, int colonne){ char **matrice = new char*[righe]; for(int i=0; i<righe; i++) matrice[i] = new char[colonne]; return matrice; }
la funzione stampa_matrice si trova in stampamatrice.o ed è dichiarata in stampamatrice.h.
Ho provato a compilare da terminale e ho ottenuto un errore:
g++ ese2.cc stampamatrice.o /usr/bin/ld: i386:x86-64 l'architettura del file di input "stampamatrice.o" è incompatibile con l'output i386
è perchè il file .o da me linkato è stato compilato su una macchina a 64bit e il mio è a 32?
ho provato ad usare la mia stampa:
void stampa (char **matrice, int righe, int colonne){ for(int r=0; r<righe; r++){ for(int c=0; c< colonne; c++) cout << " " << matrice[r][c]; cout << endl; } }
e sembra funzionare
Risposte
Hai provato ad aggiungere -m64 alle opzioni di compilazione? Però se non hai un sistema operativo a 64bit non potrai però eseguirlo.
L'unica alternativa nel caso il tuo sistema sia a 32bit direi che è ricompilare stampamatrice oppure farti mandare dal professore una versione a 32bit.
L'unica alternativa nel caso il tuo sistema sia a 32bit direi che è ricompilare stampamatrice oppure farti mandare dal professore una versione a 32bit.
hmm... siccome il file stampamatrice.o è un eseguibile gia' compilato dal prof, non ho il sorgente, no nso cosa sia -m64 e sul mio desktop gira un sistema 64bit. ora che ho incontrato questo problema... boh... cmq ho provato a riscrivere la funzione da me e tutto va. piu' che altro non sarebbe carino mi accadesse durante l'esame!
EDIT: è la prima volta che mi capita.ho gia' fatto degli esercizi simili e nn ho avuto questo problema, anche se usavo lo stesso stampamatrice.o
EDIT: è la prima volta che mi capita.ho gia' fatto degli esercizi simili e nn ho avuto questo problema, anche se usavo lo stesso stampamatrice.o
-m64 dovrebbe essere l'istruzione di gcc per farlo compilare a 64bit. Se il tuo computer è a 64 bit allora semplicemente aggiungi -m64 nella chiamati di gcc
Mi sa che è più probabile che il file stampamatrice.o sia compilato per x86 (32 bit) e che il compilatore di BoG compili di default per x64 (64 bit). Per toglierti ogni dubbio, dai il comando
In tal caso, a occhio dovresti aggiungere -m32 alle opzioni di gcc (e nel caso installare la toolchain a 32 bit, come farlo però dipende dal tuo sistema).
file stampamatrice.o
In tal caso, a occhio dovresti aggiungere -m32 alle opzioni di gcc (e nel caso installare la toolchain a 32 bit, come farlo però dipende dal tuo sistema).
"claudio86":
Mi sa che è più probabile che il file stampamatrice.o sia compilato per x86 (32 bit) e che il compilatore di BoG compili di default per x64 (64 bit). Per toglierti ogni dubbio, dai il comando
file stampamatrice.o
In tal caso, a occhio dovresti aggiungere -m32 alle opzioni di gcc (e nel caso installare la toolchain a 32 bit, come farlo però dipende dal tuo sistema).
In effetti non hai tutti i torti...
ho provato a dare il commando:
che vuol dire? è un file a 64 bit? cmq se il mio sistema è a 64bit, gcc (nel mio caso g++) compilera' in automatico a 64bit?
EDIT: fermi tutti! mi sa che ho sparato una ca33ta! Mi sono confuso perchè in realta' lavoro su 2 pc: uno a casa ed un portatile. La cartella degli esercizi è condivisa tra i 2 PC tramite Ubuntuone. Peccato che quello di casa ha un sistema a 64bit e quello portatile è a 32. Il problema insorge solo sul pc portatile, quello a 32bit.
Ho provato a usare -m64 e 32:
bog@bog-desktop:~/uni$ file stampamatrice.o stampamatrice.o: ELF 64-bit LSB relocatable, x86-64, version 1 (SYSV), not stripped
che vuol dire? è un file a 64 bit? cmq se il mio sistema è a 64bit, gcc (nel mio caso g++) compilera' in automatico a 64bit?
EDIT: fermi tutti! mi sa che ho sparato una ca33ta! Mi sono confuso perchè in realta' lavoro su 2 pc: uno a casa ed un portatile. La cartella degli esercizi è condivisa tra i 2 PC tramite Ubuntuone. Peccato che quello di casa ha un sistema a 64bit e quello portatile è a 32. Il problema insorge solo sul pc portatile, quello a 32bit.
Ho provato a usare -m64 e 32:
bog@bog-1215P:~/uni$ g++ ese2.cc stampamatrice.o -m64 In file included from ese2.cc:2:0: /usr/include/c++/4.7/iostream:39:28: fatal error: bits/c++config.h: File o directory non esistente compilation terminated. bog@bog-1215P:~/uni$ g++ ese2.cc stampamatrice.o -m32 /usr/bin/ld: i386:x86-64 l'architettura del file di input "stampamatrice.o" è incompatibile con l'output i386 collect2: error: ld returned 1 exit status
Mi sbagliavo, il file stampamatrice.o è effettivamente compilato per x64. Mi sembrava assurdo che un professore fornisse solo un binario per x64 agli studenti (perché viene da un professore, vero?). Anche se in effetti è già abbastanza assurdo fornire un binario di per sé.
Nel tuo portatile hai solo il compilatore per x86 (32bit). Se compili con -m32 non cambia niente (è già un parametro implicito), e il linker si lamenta che stampamatrice.o è di un'architettura diversa. Se compili con -m64 forzi il compilatore a compilare per x64, ma non hai quella toolchain installata (manca il file bits/c++config.h, oltre ad una moltitudine di altri file).
Devi installare il compilatore per x64. Ed un emulatore per x64, dato che non potrai eseguire il programma. O, meglio, chiedere al professore una versione x86 di stampamatrice.o (o direttamente il sorgente, che ci sarà mai di così segreto…?).
"BoG":
Il problema insorge solo sul pc portatile, quello a 32bit.
Ho provato a usare -m64 e 32:
bog@bog-1215P:~/uni$ g++ ese2.cc stampamatrice.o -m64 In file included from ese2.cc:2:0: /usr/include/c++/4.7/iostream:39:28: fatal error: bits/c++config.h: File o directory non esistente compilation terminated. bog@bog-1215P:~/uni$ g++ ese2.cc stampamatrice.o -m32 /usr/bin/ld: i386:x86-64 l'architettura del file di input "stampamatrice.o" è incompatibile con l'output i386 collect2: error: ld returned 1 exit status
Nel tuo portatile hai solo il compilatore per x86 (32bit). Se compili con -m32 non cambia niente (è già un parametro implicito), e il linker si lamenta che stampamatrice.o è di un'architettura diversa. Se compili con -m64 forzi il compilatore a compilare per x64, ma non hai quella toolchain installata (manca il file bits/c++config.h, oltre ad una moltitudine di altri file).
Devi installare il compilatore per x64. Ed un emulatore per x64, dato che non potrai eseguire il programma. O, meglio, chiedere al professore una versione x86 di stampamatrice.o (o direttamente il sorgente, che ci sarà mai di così segreto…?).
Grazie ragazzi, ho capito!
ormai me la sono scritta da me la funzione...quindi bom! Funziona!
ormai me la sono scritta da me la funzione...quindi bom! Funziona!