PDA

View Full Version : [C++] PORTING DA WINDOWS A LINUX


ciusss89
27-09-2012, 10:18
Ciao gente, al momento mi sto provando a fare il porting di un'applicazione windows in linux per un progetto del politecnico, spero possiate darmi una mano:

Gli step compiuti e come ho ragionato :
Ho ipotizzato che prima di guardare il corpo del main, mi convenga mettere apposto tutto quello che include il main come librerie e funzioni e headers, ho quindi provveduto a ricercarmi le librerie mancanti e quelle equivalenti, e gli header necessari. Ho poi "verificato" la compatibilità della sostituzioni che effettuavo.
Ho proseguito creando un main vuoto (hello world) che includesse solo ed esclusivamente quello che include il main originale ( praticamente richiama un main.h). La compilazione di questo parziale risultato ha dato esito positivo.
(L'applicazione si appoggia a gnu_radio, e libusb, spesso è stato sufficiente sostiture l'equivalente xxx_win32.h con xxx_linux.h, o adattare qualche chiamata tipo xxx_win32 () in xxx_linx( ) )

Quando "ho unito" il main al resto del corpo del progamma, ecco il disastro, una gran quantita di errori, ma non credo dovuti al parte precedente.

Applicazione orginale (Source.zip)
L'ibrido da me creato (Ibrido.zip)
L'unione che non funzione (Err.zip)
Estrarre il contenuto per compilare [ $ g++ main.cpp -o test.o ]. Al momento il mio obiettivo è far compilare il binario.

Chi ha scritto il codice, non fornisce dettagli riguardo la piattaforma usata per la compilazione ne le modalità ...

COMPILANDO IL MAIN HELLO WORLD

giuse@book-dk:~/MAIL_B/IBRID0$ cat main.cpp
#include "main.h"

using namespace std;

int main(int argc ,char *argv[])
{
cout << "Hello world!" << endl;
return 0;
}

giuse@book-dk:~/MAIL_B/IBRID0$ g++ main.cpp -o test.o
In file included from main.h:7:0,
from main.cpp:1:
fx2.h:64:1: warning: ‘typedef’ was ignored in this declaration [enabled by default]
giuse@book-dk:~/MAIL_B/IBRID0$


COMPILANDO IL MAIN

giuse@book-dk:~/MAIL_B/ERR$ g++ main.cpp -o test.o
In file included from main.h:7:0,
from main.cpp:68:
fx2.h:64:1: warning: ‘typedef’ was ignored in this declaration [enabled by default]
main.cpp: In function ‘int main(int, char**)’:
main.cpp:313:32: error: ‘DeleteFile’ was not declared in this scope
main.cpp:368:5: error: ‘HANDLE’ was not declared in this scope
main.cpp:368:12: error: expected ‘;’ before ‘hStdout’
main.cpp:369:5: error: ‘hStdout’ was not declared in this scope
main.cpp:369:32: error: ‘STD_OUTPUT_HANDLE’ was not declared in this scope
main.cpp:369:49: error: ‘GetStdHandle’ was not declared in this scope
main.cpp:370:5: error: ‘COORD’ was not declared in this scope
main.cpp:370:11: error: expected ‘;’ before ‘coord’
main.cpp:371:5: error: ‘CONSOLE_SCREEN_BUFFER_INFO’ was not declared in this scope
main.cpp:371:32: error: expected ‘;’ before ‘bInfo’
main.cpp:379:42: error: ‘bInfo’ was not declared in this scope
main.cpp:379:64: error: ‘SetConsoleCursorPosition’ was not declared in this scope
main.cpp:425:44: error: ‘bInfo’ was not declared in this scope
main.cpp:425:49: error: ‘GetConsoleScreenBufferInfo’ was not declared in this scope
main.cpp:427:64: error: ‘SetConsoleCursorPosition’ was not declared in this scope
main.cpp:436:48: error: ‘bInfo’ was not declared in this scope
main.cpp:436:70: error: ‘SetConsoleCursorPosition’ was not declared in this scope
main.cpp:514:39: error: ‘DeleteFile’ was not declared in this scope
main.cpp:584:35: error: ‘DeleteFile’ was not declared in this scope
giuse@book-dk:~/MAIL_B/ERR$


QUI IL MAIN (http://pastebin.com/0zERitLe), include esattamente main.h. Gli errori di compilazione non credo siano causati dalla lavoro fin'ora svolto.
FILE (http://www.sendspace.com/filegroup/w8EB5raTL38IVlZ3RFShbr2kNv0HDiXp)

Piccolo dettaglio io di c++ non so nulla.

tomminno
27-09-2012, 10:32
Il file che hai postato è scritto esplicitamente per Windows:


HANDLE hStdout;
hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
COORD coord;
CONSOLE_SCREEN_BUFFER_INFO bInfo;


così ad occhio vengono usati per sovrascrivere caratteri sulla console.

ciusss89
27-09-2012, 10:42
In questa ipotesi devo tirare fuori l'algoritmo, cmq esplicitamente per Windows, da cosa lo deduci????

Cioè quel codice che hai evidenziato cosa fa??

ciusss89
27-09-2012, 11:12
Grazie alle tue dritte, ho eliminato tutta le rimanenti intrusioni riferite a windows, ora rimangono problemi sulla funzione DeleteFile

E' una funzione ansi c del c++???

ciusss89
27-09-2012, 11:16
risolto in parte DeleteFile non è ansi, sostituita con remove.

Ora ho altri problemi -.-


giuse@book-dk:~/MAIL_B/IBRID0$ g++ main.cpp -o test.o
In file included from main.h:7:0,
from main.cpp:5:
fx2.h:64:1: warning: ‘typedef’ was ignored in this declaration [enabled by default]
/tmp/cc93oJJZ.o: In function `main':
main.cpp:(.text+0xd9): undefined reference to `Fx2_dev::Fx2_dev(int)'
main.cpp:(.text+0xed): undefined reference to `Fx2_dev::Fx2_dev(int)'
main.cpp:(.text+0x118): undefined reference to `Fx2_dev::~Fx2_dev()'
main.cpp:(.text+0x127): undefined reference to `Fx2_dev::usb_fx2_find()'
main.cpp:(.text+0x152): undefined reference to `Fx2_dev::close()'
main.cpp:(.text+0x2d4): undefined reference to `FileSaver::FileSaver(char*)'
main.cpp:(.text+0x2ed): undefined reference to `FileSaver::open_file(char*)'
main.cpp:(.text+0x301): undefined reference to `FileSaver::set_fid(int)'
main.cpp:(.text+0x315): undefined reference to `FileSaver::set_decimate(unsigned int)'
main.cpp:(.text+0x329): undefined reference to `FileSaver::set_pack(unsigned int)'
main.cpp:(.text+0x342): undefined reference to `FileSaver::FileSaver(char*)'
main.cpp:(.text+0x35b): undefined reference to `FileSaver::open_file(char*)'
main.cpp:(.text+0x36f): undefined reference to `FileSaver::set_fid(int)'
main.cpp:(.text+0x383): undefined reference to `FileSaver::set_pack(unsigned int)'
main.cpp:(.text+0x397): undefined reference to `FileSaver::set_decimate(unsigned int)'
main.cpp:(.text+0x3ac): undefined reference to `FileSaver::close_file()'
main.cpp:(.text+0x3ca): undefined reference to `Fx2_dev::usb_fx2_init()'
main.cpp:(.text+0x3e3): undefined reference to `Fx2_dev::usrp_xfer(char, char)'
main.cpp:(.text+0x3fc): undefined reference to `Fx2_dev::usrp_xfer(char, char)'
main.cpp:(.text+0x415): undefined reference to `Fx2_dev::usrp_xfer(char, char)'
main.cpp:(.text+0x42e): undefined reference to `Fx2_dev::usrp_xfer(char, char)'
main.cpp:(.text+0x457): undefined reference to `Fx2_dev::usrp_xfer2(char, char, unsigned char*, char)'
main.cpp:(.text+0x470): undefined reference to `Fx2_dev::usrp_xfer(char, char)'
main.cpp:(.text+0x484): undefined reference to `FileSaver::set_decimate(unsigned int)'
main.cpp:(.text+0x532): undefined reference to `Fx2_dev::usrp_xfer(char, char)'
main.cpp:(.text+0x54b): undefined reference to `Fx2_dev::usrp_xfer(char, char)'
main.cpp:(.text+0x10f2): undefined reference to `Fx2_dev::check_rx_overrun(bool*)'
main.cpp:(.text+0x115a): undefined reference to `FileSaver::close_file()'
main.cpp:(.text+0x1169): undefined reference to `FileSaver::close_file()'
main.cpp:(.text+0x1343): undefined reference to `FileSaver::close_file()'
main.cpp:(.text+0x1361): undefined reference to `Fx2_dev::close()'
main.cpp:(.text+0x1370): undefined reference to `Fx2_dev::~Fx2_dev()'
main.cpp:(.text+0x1390): undefined reference to `Fx2_dev::read_IF(char*)'
main.cpp:(.text+0x13b8): undefined reference to `FileSaver::save_data(char*, unsigned int, int)'
main.cpp:(.text+0x168c): undefined reference to `FileSaver::close_file()'
main.cpp:(.text+0x169b): undefined reference to `FileSaver::close_file()'
main.cpp:(.text+0x16bf): undefined reference to `Fx2_dev::~Fx2_dev()'
main.cpp:(.text+0x16ce): undefined reference to `Fx2_dev::close()'
main.cpp:(.text+0x16dd): undefined reference to `Fx2_dev::~Fx2_dev()'
main.cpp:(.text+0x16fb): undefined reference to `Fx2_dev::~Fx2_dev()'
main.cpp:(.text+0x1720): undefined reference to `Fx2_dev::~Fx2_dev()'
collect2: error: ld returned 1 exit status
giuse@book-dk:~/MAIL_B/IBRID0$


L'errore è evidente il main, non ha accesso ai blocchi Fx2 e Fileserver, sembrano scorrelati...

tomminno
27-09-2012, 15:13
Mi sa che ti mancano i file cpp (o la libreria) in cui è definito quel codice

[Kendall]
27-09-2012, 18:56
Uhi uhi, ora non so la complessità del programma originale, ma se quello non è stato scritto in ottica multipiatta son dolori a trasporlo per piattaforma linux, mi verrebbe quasi da pensare che sia più facile prendere i sorgenti e, seguendo la loro struttura riscrivere il tutto (magari prendendo a man bassa da quel codice, ma facendoti i vari step da te).

Che poi, altro particolare, tale programma immagino sia solo per console (altrimenti avresti avuto n-mila errori).

ciusss89
27-09-2012, 19:06
;38195478']Uhi uhi, ora non so la complessità del programma originale, ma se quello non è stato scritto in ottica multipiatta son dolori a trasporlo per piattaforma linux, mi verrebbe quasi da pensare che sia più facile prendere i sorgenti e, seguendo la loro struttura riscrivere il tutto (magari prendendo a man bassa da quel codice, ma facendoti i vari step da te).

Che poi, altro particolare, tale programma immagino sia solo per console (altrimenti avresti avuto n-mila errori).

Si è solo per console, le prime due revisioni erano multipiattaforma, ma entrambe scritte con i piedi, ma tante ke non erano utilizzabili, hanno rilasciato questa terza versione, senza specificare un cazzo...

Chi ha pubblicato sta robaccia è il dipartimento aerospaziale della University of Colorado...:stordita:

Tommo
27-09-2012, 19:50
Ah, sappi che se provi a compilare il programma modificato per win 100% non è più compatibile :D

In questi casi l'unica uscita sana è:
0) rimuovere tutta la roba "inutilmente" platform specific, ovvero tutta quella roba gestibile da ansi C + librerie crossplatform tipo files, sockets, threads; possibilmente dopo questo passo rimane poca roba non compatibile
1) individuare un subset limitato di "scambi" platform-specific che il programma fa con l'OS, riducendo all'osso la "generalità" di quello che può fare (es: aprire una finestra, gestire gli input, aprire un box con che dice qualcosa)
2) modificare questo subset per renderlo compatibile con linux/mac/iphone o quello che è, in modo da trovare un minimo comun denominatore funzionale tra i 2 os
3) scrivere degli header comuni + un set di .c per ogni OS che implementano le stesse funzioni sui diversi sistemi (uguali fino all'ultimo dettaglio!)
4) isolare il programma originale sostituendo tutte le chiamate all'OS con tutte le chiamate alla tua libreria
5) ripetere 3 e 4 testando e bestemmiando fin quando tutto funziona davvero come ti aspetti e gli undocumented behaviour inaspettati smettono di saltare fuori :asd:

protip: più questo "subset" è di basso livello, meno bestemmie dovrai tirare. La bravura sta tutta nel trovare i punti in comune tra gli OS :D

Ovviamente, questo se vuoi portarti dietro anche la versione windows... se la versione win è abbandonata converti tutto a linux e bona.

[Kendall]
28-09-2012, 00:16
Ah, sappi che se provi a compilare il programma modificato per win 100% non è più compatibile :D

In questi casi l'unica uscita sana è:
0) rimuovere tutta la roba "inutilmente" platform specific, ovvero tutta quella roba gestibile da ansi C + librerie crossplatform tipo files, sockets, threads; possibilmente dopo questo passo rimane poca roba non compatibile
1) individuare un subset limitato di "scambi" platform-specific che il programma fa con l'OS, riducendo all'osso la "generalità" di quello che può fare (es: aprire una finestra, gestire gli input, aprire un box con che dice qualcosa)
2) modificare questo subset per renderlo compatibile con linux/mac/iphone o quello che è, in modo da trovare un minimo comun denominatore funzionale tra i 2 os
3) scrivere degli header comuni + un set di .c per ogni OS che implementano le stesse funzioni sui diversi sistemi (uguali fino all'ultimo dettaglio!)
4) isolare il programma originale sostituendo tutte le chiamate all'OS con tutte le chiamate alla tua libreria
5) ripetere 3 e 4 testando e bestemmiando fin quando tutto funziona davvero come ti aspetti e gli undocumented behaviour inaspettati smettono di saltare fuori :asd:

protip: più questo "subset" è di basso livello, meno bestemmie dovrai tirare. La bravura sta tutta nel trovare i punti in comune tra gli OS :D

Ovviamente, questo se vuoi portarti dietro anche la versione windows... se la versione win è abbandonata converti tutto a linux e bona.

Derivava proprio da tutta questa serie di passaggi il mio "Uhi uhi..." :D