|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Jul 2008
Città: mondovi
Messaggi: 1491
|
[C++] PORTING DA WINDOWS A LINUX
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 Codice:
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$
Codice:
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$
FILE Piccolo dettaglio io di c++ non so nulla.
__________________
MB: Aw9d-max CPU: E6600 @ 3,32ghz (vcore default 1,275), DDR2 2x1gb 3/4/4/12 @ 2,10V , VGA: POV 8800 GTS 320mb 648/1458/975. RAFFREDDAMENTO A LIQUIDO ARTIGINALE ...Vendo : ROUTER STATION PRO, SISTEMA EMEDDED. |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3306
|
Il file che hai postato è scritto esplicitamente per Windows:
Codice:
HANDLE hStdout;
hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
COORD coord;
CONSOLE_SCREEN_BUFFER_INFO bInfo;
|
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Jul 2008
Città: mondovi
Messaggi: 1491
|
In questa ipotesi devo tirare fuori l'algoritmo, cmq esplicitamente per Windows, da cosa lo deduci????
Cioè quel codice che hai evidenziato cosa fa??
__________________
MB: Aw9d-max CPU: E6600 @ 3,32ghz (vcore default 1,275), DDR2 2x1gb 3/4/4/12 @ 2,10V , VGA: POV 8800 GTS 320mb 648/1458/975. RAFFREDDAMENTO A LIQUIDO ARTIGINALE ...Vendo : ROUTER STATION PRO, SISTEMA EMEDDED. |
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Jul 2008
Città: mondovi
Messaggi: 1491
|
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++???
__________________
MB: Aw9d-max CPU: E6600 @ 3,32ghz (vcore default 1,275), DDR2 2x1gb 3/4/4/12 @ 2,10V , VGA: POV 8800 GTS 320mb 648/1458/975. RAFFREDDAMENTO A LIQUIDO ARTIGINALE ...Vendo : ROUTER STATION PRO, SISTEMA EMEDDED. |
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Jul 2008
Città: mondovi
Messaggi: 1491
|
risolto in parte DeleteFile non è ansi, sostituita con remove.
Ora ho altri problemi -.- Codice:
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$
__________________
MB: Aw9d-max CPU: E6600 @ 3,32ghz (vcore default 1,275), DDR2 2x1gb 3/4/4/12 @ 2,10V , VGA: POV 8800 GTS 320mb 648/1458/975. RAFFREDDAMENTO A LIQUIDO ARTIGINALE ...Vendo : ROUTER STATION PRO, SISTEMA EMEDDED. Ultima modifica di ciusss89 : 27-09-2012 alle 11:24. |
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3306
|
Mi sa che ti mancano i file cpp (o la libreria) in cui è definito quel codice
|
|
|
|
|
|
#7 |
|
Senior Member
Iscritto dal: Jul 2005
Città: Vicenza
Messaggi: 1570
|
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). |
|
|
|
|
|
#8 | |
|
Senior Member
Iscritto dal: Jul 2008
Città: mondovi
Messaggi: 1491
|
Quote:
Chi ha pubblicato sta robaccia è il dipartimento aerospaziale della University of Colorado...
__________________
MB: Aw9d-max CPU: E6600 @ 3,32ghz (vcore default 1,275), DDR2 2x1gb 3/4/4/12 @ 2,10V , VGA: POV 8800 GTS 320mb 648/1458/975. RAFFREDDAMENTO A LIQUIDO ARTIGINALE ...Vendo : ROUTER STATION PRO, SISTEMA EMEDDED. |
|
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Feb 2006
Messaggi: 1304
|
Ah, sappi che se provi a compilare il programma modificato per win 100% non è più compatibile
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 ![]() protip: più questo "subset" è di basso livello, meno bestemmie dovrai tirare. La bravura sta tutta nel trovare i punti in comune tra gli OS Ovviamente, questo se vuoi portarti dietro anche la versione windows... se la versione win è abbandonata converti tutto a linux e bona. Ultima modifica di Tommo : 27-09-2012 alle 20:01. |
|
|
|
|
|
#10 | |
|
Senior Member
Iscritto dal: Jul 2005
Città: Vicenza
Messaggi: 1570
|
Quote:
|
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 06:52.










...










