Newsgroup: it.comp.os.unix
Titolo: Aiuto per compilazione sotto solaris

Ho un programma  in c++ che sotto linux compila  perfettamente e siccome
devo  curarne anche  la portabilità  tra  i vari  sistemi operativi  sto
cercando di portalo sotto solaris.
Ebbene, ad un certo punto mi viene fuori questoo errore (sunOs5.8):
In file included from /usr/include/netinet/in.h:41,
                 from /usr/include/netdb.h:96,
		 from ../low/connection.h:4,
		 from dreamer.cc:6:
/usr/include/sys/stream.h:67: `struct queue' redeclared as different kind
of symbol
/usr/local/include/g++/stl_queue.h:41 previous declaration of `template
<class T>, class Sequence = class deque<T,__default_alloc_template<false,0>,0>>
class queue<T,Sequence>'
*** Error code 1
Sembrerebbe  che  ci   siano  due  queue,  una  in  <queue>   e  una  in
<sys/stream.h>. Purtroppo mi servono entrambi gli header.
Avete una idea di come fare per riuscire a farlo compilare?
-- 
Quando fu chiaro  che l'OS/2 non avrebbe avuto un  seguito, la Microsoft
fece una  scelta diversa,  sviluppando Windows come  interfaccia grafica
orientata al  mouse con MS-DOS. L'idea  fu la seguente: se  non possiamo
sbarazzarci di MS-DOS almeno cerchiamo di camuffarlo.
                          [A. S. Tanenbaum, I moderni sistemi operativi]

 Ebbene, ad un certo punto mi viene fuori questoo errore (sunOs5.8):
Prova ad installare gnu gcc, make, binutils per solaris: trovi in binari in formato
pkg su 
www.sunfreeware.com
, sia per sparc che per intel.
bye G.L.
--
La logica non attiene alla verosimiglianza delle ipotesi,
ma alla coerenza delle tesi con le ipotesi.

 intel.
tragedia...
Ho letto  bene il  messaggio di errore  e ho scoperto  che gli  header C
vengono presi  dalla libreria C della  SUN, mentre quelli C++  da quella
GNU... Ecco il motivo del conflitto....
Ah, compilo gią col g++.
Sapete dove sta la libreria C++ della  sun e dove stanno i suoi headers?
Prova a passare un po' di parametri al g++....
Grazie


 Passa a gcc e binutils.
la macchina non  è mia, ovvero non  sono root. Ho solo il  mio account e
posso usare quello che c'è.
Comunque io uso già il g++, il problema è che cozzano le due librerie...
Tu  hai  una  sun  installata  decentemente? Se  ti  mando  il  sorgente
proveresti a compilarlo?
Ciao


 <sys/stream.h>. Purtroppo mi servono entrambi gli header.
Collisione di nomi. Se  la libreria C++ e` abbastanza  recente basta non
importare tutte le definizioni nel namespace globale:
#include <sys/stream.h>
#include <queue>
....
queue a;                /* struttura definita in sys/stream.h */
std::queue<int> b;      /* classe definita in queue */
In pratica  dovresti rimuovere  eventuali "using namespace  std;" oppure
"using std::queue;".
L'alternativa  (con   compilatore  e/o  libreria  std   vecchi  che  non
gestiscono  correttamente  il  namespace  std)  e`  quella  di  inserire
esplicitamente  gli header  in  un namespace  separato. Se non  esistono
interdipendenze tra  sys/stream.h ed  altri include allora  la soluzione
piu`  semplice   e`  quella  di   creare  un  namespace   appostito  per
sys/stream.h:
namespace foo {
#include <sys/stream.h>
}
#include <queue>
foo::queue a;           /* struttura definita in sys/stream.h */
queue<int> b;      /* classe definita in queue */
Se  ci sono  problemi puoi  provare ad  inserire queue  in un  namespace
(meglio std, sperando di evitare problemi con il resto della libreria):
#include <sys/stream.h>
namespace std {
#include <queue>
}
ciao
Kronos
-- 
Home: 
http://kronoz.cjb.net
"Di tutte le perversioni sessuali, la castita` e` la piu` strana".
Anatole France

 sys/stream.h:
ho provato  tutto e  non va. A  questo punto spero  che sia  la macchina
installata male...


 installata male...
Hum, ancora collisione? Prova a compilare questo:
namespace foo {
        int i = 1;
}
int main() {
        i++;
}
Se compila  allora il  compilatore non supporta  i namespace,  e l'unica
soluzione pare sia mettere mano agli header.
Se  il compilatore  si lamenta  vuol dire  che gestisce  correttamente i
namespace, ed il problema e`  della libreria. In questo caso continui ad
ottenere  una collisione  perche`  (IMHO) qualche  altro header  include
sys/stream.h.
Prova  a  racchiudere  *tutti*  gli  header C  all'interno  di  un  loro
namespace e vedi cosa succede.
ciao
Kronos
-- 
Home: 
http://kronoz.cjb.net
"La teoria e` quando sappiamo come funzionano le cose ma non funzionano.
 La pratica e` quando le cose funzionano ma non sappiamo perche`.
 Abbiamo unito la teoria e la pratica: le cose non funzionano piu` e non
 sappiamo il perche`." -- A. Einstein

 namespace e vedi cosa succede.
urca... ma è un lavoro enorme...  Non è che cambiando compilatore poi le
cose si risolvano?


 Non e` che cambiando compilatore poi le cose si risolvano?
Probabile, ma il cambio di compilatore  non e` proprio una cosa semplice
*soprattutto*  con il  C++, dove  praticamente ogni  compilatore ha  una
propria ABI.
In  altre  parole  dovresti  utilizzare un  compilatore  nuovo  *e*  una
libreria standard compilata con quel compilatore. Ovviamente la libreria
vecchia  deve rimanere  dove  sta, altrimenti  gli  altri programmi  non
sarebbero molto contenti :)
Nel caso  tu volessi cambiare  compilatore considera quello  della Intel
(gratis per uso non commerciale,  molto standard, veloce, superlativo se
hai  una  CPU  Intel)  oppure il  Comeau  (
www.comeaucomputing.com
)  che
attualmente e` il non plus  ultra dei compilatori C++ (pero` costicchia:
43$ e utilizza il gcc come backend).
ciao
Kronos
-- 
Home: 
http://kronoz.cjb.net
Quando un uomo porta dei fiori a sua moglie senza motivo, 
un motivo c'e`.