Newsgroup: it.comp.lang.c++
Titolo: Dubbi atavici sul linguaggio gcc

La mia intenzione e' di creare una veloce routine open source sotto
Linux e fare poi il porting sotto Windows.
Pensavo quindi di usare gcc.
I primi dubbi sono nati facendo cose semplici quali scorrere directory
in cascata, prelevare la path del programma attuale, creare una
directory dove ho travato tanti esempi (tutti diversi).
Tanto per cominciare mi sembra di aver capito che per fare queste cose
le routines e le librerie da usare sia sotto Linux che sotto Windows
sono profondamente diverse.
Premetto che compilo con comandi tipo 
gcc -o xxx xxx.c
Non e' possibile usare lo stesso codice e le stesse librerie tenendo
conto che faccio un programmino che lavora con standard input e
standard output e che vorrei compilare sia su Linux che su Windows ?
Forse mi conviene usare un linguaggio piu' portabile che abbia un
maggior livello di astrazione (che ne so dello scripting Perl o
qualcosa di diverso) ?
----------------------------------------------------------
Paolo Hölzl
Gruppo Tekup Software developer (Bologna)
----------------------------------------------------------
ATTENTION!, antispam 
For reply, substitute xxx with gruppotekup

 qualcosa di diverso) ?
Indubbiamente si.
Suggerimento: 
www.python.org
-- 
Gerolamo
www.overweb.it

 
suggerimenti:
se vuoi rimanere sul c e/o c++ (dando la precedenza a Linux):
www.cygwin.com
se invece vuoi qualcosa di diverso:
java.sun.com
oppure se hai tempo da perdere:
costruisciti uno strato di portabilità con interfaccia comune
(il problema principale è costruire una semantica comune che sfrutti al 
meglio le possibilità dei due O.S. vedi ad esempio apertura di file, 
creazione di processi, thread, etc.)

creazione di processi, thread, etc.)
Scartata a priori a quel punto scrivo con due linguaggi divers e
chiuso che almeno viaggio spedito.


 Linux e fare poi il porting sotto Windows...
la butto li', kylix?
Mieru

>la butto li', kylix?
Considera che devo fare l'equivalente di una ls, con la quantita' di
librerie che si porta dietro non ci penso proprio.
Il mio compilato possibilmente non va neppure installato, copio il
binario.


 
Con Mingw32 ci sono i problemi che descrivi perchč rimangono comuni ai 
due ambienti "solo" il linguaggio e le librerie standard.
Rimane quindi ancora la differenza tra le syscall di Unix 
(open,close,read,write,etc..) e le API di Win32 
(CreateFile,CloseHandle,ReadFile,WriteFile,etc..)
Con Cygwin invece puoi usare le funioni standard di Unix su Windows.
Gli inconvenienti sono: il software cosě prodotto č sotto la GPL, 
l'esecuzione č piů lenta (comunque meglio di Java), il codice compilato 
č piů complesso quindi difficile da debuggare e con piů bachi (anche da 
parte di cygwin, che per questo rilascia aggiornamenti quasi mensilmente).

parte di cygwin, che per questo rilascia aggiornamenti quasi mensilmente).
Ottimo, e' proprio quello che mi serve, tieni conto che mi interessa
di piu' la velocita' sotto Linux e comunque voglio sviluppare una
routines Open Source sotto GPL.
Comincio quanto prima, grazie
Java lo avevo scartato anche perche' farsi caricare una virtual
machine per fare l'equivalente di una ls ..


>Ottimo, e' proprio quello che mi serve
Scusa ma mi rimangio quanto ho detto, in tal caso per fare un ls
dovrei emulare l'ambiente Linux e portarmi dietro l'emulatore, non se
ne parla.
Ho capito, lo faccio in Gcc sotto Linux e sotto Windows lo faro' con
qualche cosa di diverso (il C++ del Visual Studio visto che quello lo
abbiamo).
Peccato.


 Peccato.
Perchč! non mi sembra un grande problema.

 Pensavo quindi di usare gcc.
Usa CygWin oppure wxWindows (con il minimo indispensabile, altrimenti ti
trovi un eseguibile da 15MB).
 bye
	av.

 Windows sono profondamente diverse.
abbastanza, ma non "profondamente". Molte runtime C++, e questo include 
tutte quelle per Windows, forniscono una minima emulazione UNIX, giusto 
per non impazzire più del dovuto. Ricorda che UNIX è portabile, ma il C 
e il C++ lo sono sicuramente molto di più: se puoi evitare di usare una 
funzione specifica alla piattaforma, fallo
-- 
  < 
http://www.reactos.com/
 >  Open source clone of Windows NT. Current
      Don't stand, REACT!      version 0.1.3. C, C++ and ASM developers
                               and beta testers are welcome!

 Considera che devo fare l'equivalente di una ls, [...]
in Borland C++ e GCC ci sono _opendir/_readdir/_closedir, in Visual C++ 
puoi usare _findfirst/_findnext/_findclose (#include <io.h>), pressochè 
equivalenti


necessario. Se non altro per questione di migliore manutenzione.
Devo dire che ho visto un fronte molto limitato di codice ma quello
che ho visto non mi e' piaciuto molto, sono oramai 18 anni che
sviluppo software e ho usato un po di tutto Cobol, Pascal, Fortran,
PL1, Access, VB, con e senza database server, e quindi prima di
scegliere un nuovo linguaggio da studiare cerco di 'mirare giusto'.
Voglio fare qualcosa in open source e magari convertire qualche mio
bel programma in Pascal, ma prima di buttarmici a capofitto voglio
scegliere l'ambiente piu' adatto.
Routines di sistema devono essere piu' veloci possibile, senza
interazione grafica, e senza particolari problemi di installazione.
Ne ho sentite di tutte di piu', ma guardando gli strumenti per Linux
penso la strada giusta in tal caso sembra sia Gcc.
Per lo sviluppo con la parte grafica (anche se strutturalmente non mi
piace granche') sia Gcc con KDevelop.
Per la parte Web sto gia da tempo lavorando con Php che trovo
decisamente superiore ad Asp (che ho usato parecchio a suo tempo).
Per il porting 'estremo' il Java.


funzione specifica alla piattaforma, fallo
Mi sembra una buona considerazione, dato che mi aspetto un progressivo
e rapido miglioramento di Gcc sotto Linux questa e' una strada che,
almeno per Linux vorrei seguire.
Nel caso in esame dovevo fare delle cose sulla carta molto semplici,
tra cui pescare ricursivamente dei rami di directory e creare una
directory.
Ho trovato molto codice ma mi ha stupito l'estrema differenza di
utilizzo, il fatto che quasi nulla mi ha funzionato 'da subito', il
fatto che addirittura un comando come mkdir (usando dir.h) desse
risultati molto diversi da fare una mkdir e un successivo chmod da
sistema.
Ovviamente molto e' dovuto al fatto che devo ancora allestire
l'ambiente di compilazione e probabilmente seguo strade errate e uso
le librerie sbagliate.
Per fare una routine che fa tutto sommato delle cose relativamente
semplici,non vorrei dover scrivere codice che necessita di librerie
che l'utente non ha normalmente presenti complicando il porting della
routine o costringendo ad una installazione magari con tanto di
compilazione e scaricamento di librerie 'rare' o 'vetuste'.


 Mi sembra una buona considerazione,
Toh... mi sono accorto che nelle ultime librerie boost hanno aggiunto
anche il supporto alla gestione del filesistem.
Questo, credo, è esattamente quel che ti serviva:
http://www.boost.org/libs/filesystem/doc/index.htm
-- 
Gerolamo
www.overweb.it

 standard output e che vorrei compilare sia su Linux che su Windows ?
anche io ho dovuto scrivere del codice multi - piattaforma, il vero
problema sta nel trovare le librerie di cui hai bisogno che siano
cross-compilabili.
se il tuo problema riguarda solo files e directory dai un'occhiata
alla libreria "filesystem" su:
www.boost.org
altro problema di portabilita' potrebbe essere costituito dall'uso
della STL, per cui fai un'attento debugging oppure usa
un'implementazione comune sulle due piattaforme (ad es. la STLport).
ovviamente il codice che scrivi dovrai compilarlo su entrambe le
piattaforme.
ciao
                                          f

cross-compilabili.
In pratica, smentitemi eventualmente, mi sembra di aver capito che
volendo fare tale passaggio da gcc devo solo usare librerie aderenti
allo standard Posix ma non riesco a capire quali sono.
Tra l'altro mi sembra che gcc sotto Linux abbia a tal proposito il
parametro -Posix.


 parametro -Posix.
Si, ok, ma li leggi i miei messaggi??
Hai guardato 
http://www.boost.org/libs/filesystem/doc/index.htm
 ?
Non ti va bene? Perchč?
-- 
Gerolamo
www.overweb.it

 parametro -Posix.
Le librerie non devono essere "standard posix".
Devono essere semplicemente cross-compilabili cioe' compilare sia su 
windows che su linux su piu' di un compilatore.
Dici che la tua routine e' molto semplice e riguarda la manipolazione 
dei file allora la "libreria standard c++" gia' compresa in ogni 
compilatore potrebbe bastarti. Insomma potresti riuscire a fare tutto 
con fstream.
reference della libstdc++:
http://www.dinkumware.com/refxcpp.html
Se la libreria standard non ti basta scaricati la libreria boost come ti 
e' gia' stato suggerito
reference della boost:
http://www.boost.org
Questa libreria ha una sotto-libreria "filesystem" che funziona sia su 
linux che su windows.
Per scrivere la tua applicazione devi usare le classi di queste librerie.
Quello che non puoi fare e' scrivere codice del tipo
int main()
{
    // Fai qualcosa di OS dipendente tipo
    exec("ls");
    // ....
    return 0;
}
e pretentedere che funzioni su windows perche' questo e' codice 
dipendente dal sistema operativo.
Salut,
Cesare

pessima idea. Usa Borland C++ su Windows e GCC su Linux. 
E` possibile installare il gcc anche sotto Windows, passando per
DJGPP.

windows che su linux su piu' di un compilatore.
Vi ringrazio per l'estrema chiarezza delle risposte e i riferimenti
precisi, ora comincero' ad approfondire a partire dai vostri spunti.
Per quanto concerne l'exec di un comando del S.O. non avevo molti
dubbi sulla potabilita' :-)


Paolo Holzl wrote:

Prova wxWindows, nonostante il nome non è obbligatorio usare la grafica ed è
molto portabile.
E se hai la grafica (e vuoi che sia portabile) wxWindows è la scelta miliore
per chi non vuole spendere per la licenza Trolltech/Qt.
C'è un minimo supporto anche su kdevelop:D
Praise

Paolo Holzl wrote:
[cut : veramente lungo]
Ciao, leggevo un pò i messaggi del ng ed ho notato che hai un problema 
effettivo, ovvero quello di creare un'applicazione multipiattaforma.
Ora io ho lo stesso problema, nel senso che voglio rendere il software 
che ho sviluppato per la mia tesi *multipiattaforma*.
La mia scelta è ricaduta su C++ ISO *STANDARD* e librerie grafiche 
multipiattaforma fox (
www.fox-toolkit.org
) : di queste ultime ho 
apprezzato moltissimo l'idea con la quale sono progettate.
Per ogni elemento definisci il layout e TUTTI e SOLI i messaggi a cui 
vuoi che risponda.
Per quanto riguarda la differenziazione del codice non credo possa 
essere possibile scrivere codice ASSOLUTAMENTE uguale e sperare di farlo 
    compilare su macchine diverse (in certi casi fallisce anche Java...).
Ritengo solo che con una buona progettazione potresti LIMITARE al minimo 
le parti di codice che DEVI scrivere ad hoc per le varie macchine...
Spero che leggerai il mio messaggio, sono interessato al tuo parere.
P.s.: Scarto per *ovvi* motivi java (oltre che un'antipatia personale), 
e comunque devo confessare che una vocina recondita a prescindere da 
tutto tende a farmi ritenere una qualunque cosa multipiattaforma (nel 
senso che vorrei tu - codice unico) sempre sinistra e inquietante :)
Ciao !

le parti di codice che DEVI scrivere ad hoc per le varie macchine...
Il che mi andrebbe bene alla grande.
