Domanda

Quali cose dovrebbero essere tenute maggiormente a mente quando si scrivono applicazioni multipiattaforma in C?Piattaforme mirate:PC, Mac e Linux basati su Intel a 32 bit.Cerco soprattutto il tipo di versatilità che Jungle Disk ha nella sua edizione desktop USB ( http://www.jungledisk.com/desktop/download.aspx )

Quali sono i suggerimenti e i "trucchi" per questo tipo di sviluppo?

È stato utile?

Soluzione

Ho mantenuto per diversi anni una libreria di rete ANSI C che è stata portata su quasi 30 diversi sistemi operativi e compilatori.La libreria non aveva componenti GUI, il che rendeva il tutto più semplice.Abbiamo finito per astrarre in file sorgente dedicati qualsiasi routine che non fosse coerente su tutte le piattaforme e abbiamo utilizzato #defines dove appropriato in quei file sorgente.Ciò ha mantenuto il codice adattato per piattaforma isolato dalla logica aziendale principale della libreria.Abbiamo anche fatto ampio uso di typedef e dei nostri tipi dedicati in modo da poterli modificare facilmente per piattaforma, se necessario.Ciò ha reso il porting su piattaforme a 64 bit abbastanza semplice.

Se stai cercando componenti GUI, suggerirei di guardare toolkit GUI come WxWindows o Qt (che sono entrambe librerie C++).

Altri suggerimenti

Cerca di evitare #ifdef dipendenti dalla piattaforma, poiché tendono a crescere in modo esponenziale quando aggiungi nuove piattaforme.Prova invece a organizzare i tuoi file sorgente come un albero con codice indipendente dalla piattaforma nella radice e codice dipendente dalla piattaforma nelle "foglie".C'è un bel libro sull'argomento, Gestione del codice multipiattaforma.Il codice di esempio in esso contenuto potrebbe sembrare obsoleto, ma le idee descritte nel libro sono ancora brillantemente vitali.

In seguito alla risposta di Kyle, lo consiglio vivamente contro cercando di utilizzare il sottosistema Posix in Windows.È implementato a un livello minimo assoluto in modo tale che Microsoft possa rivendicare il "supporto Posix" nella casella di controllo di una scheda delle funzionalità.Forse qualcuno là fuori lo usa davvero, ma non l'ho mai incontrato nella vita reale.

Si può certamente scrivere codice C multipiattaforma, devi solo essere consapevole delle differenze tra le piattaforme e testare, testare, testare.I test unitari e una soluzione CI (integrazione continua) contribuiranno notevolmente a garantire che il tuo programma funzioni su tutte le piattaforme di destinazione.

Un buon approccio è isolare le cose dipendenti dal sistema in uno o pochi moduli al massimo.Fornire un'interfaccia indipendente dal sistema da quel modulo.Quindi crea tutto il resto sopra quel modulo, quindi non dipende dal sistema per cui stai compilando.

Prova a scrivere il più possibile con POSIX.Mac e Linux supportano POSIX in modo nativo e Windows ha un sistema in grado di eseguirlo (per quanto ne so, non l'ho mai usato).Se la tua app è grafica, sia Mac che Linux supportano le librerie X11 (Linux in modo nativo, Mac tramite X11.app) ed esistono numerosi modi per far funzionare le app X11 su Windows.

Tuttavia, se stai cercando una vera implementazione multipiattaforma, probabilmente dovresti passare a un linguaggio come Java o Python che sia in grado di eseguire lo stesso programma su più sistemi con poche o nessuna modifica.

Modificare:Ho appena scaricato l'applicazione e ho guardato i file.Sembra avere i binari per tutte e 3 le piattaforme in un'unica directory.Se la tua preoccupazione è come scrivere app che possono essere spostate da una macchina all'altra senza perdere le impostazioni, probabilmente dovresti scrivere tutta la configurazione in un file nella stessa directory dell'eseguibile e non toccare il registro di Windows o creare alcuna directory punto in la cartella home dell'utente che esegue il programma su Linux o Mac.E per quanto riguarda la creazione di un binario Linux a distribuzione incrociata, POSIX/X11 a 32 bit sarebbe probabilmente la scommessa più sicura.Non sono sicuro di cosa utilizzi JungleDisk poiché attualmente utilizzo un Mac.

Esistono parecchie librerie portatili, solo esempi su cui ho lavorato in passato

1) glib e gtk+

2)libcurl

3) libapr

Coprono quasi tutte le piattaforme e quindi sono strumenti estremamente utili.

Posix va bene su Unix ma dubito che sia eccezionale su Windows, inoltre non abbiamo materiale per GUI portatili lì.

XVT dispone di un'API GUI C multipiattaforma matura da oltre 15 anni e che si trova sopra i toollkit di finestre native. Vedi WWW.XVT.COM.

Supportano almeno LINUX, Windows e MAC.

Appoggio anche la raccomandazione di separare il codice per piattaforme diverse in moduli/alberi diversi invece che in ifdef.

Inoltre consiglio di verificare in anticipo quali sono le differenze tra le vostre piattaforme e come potreste astrarle.Per esempio.queste sono alcune cose relative al sistema operativo (ad es.i fastidiosi CR,CRLF,LF nei file di testo) o cose hardware.Per esempio.la compatibilità con Posix menzionata in precedenza non ti impedisce di farlo

int c;
fread(&c, sizeof(int), 1, file);

Ma su piattaforme hardware diverse il layout della memoria interna può essere completamente diverso (endianess), costringendo a utilizzare funzioni di conversione su alcune delle piattaforme di destinazione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top