Newsgroup: it.comp.lang.c++
Titolo: Porting di librerie di classi da Unix a Win32

Salve a tutti.
Devo fare il porting di alcune librerie di classi C++ da Unix a Win32.
(Premessa: non ho mai lavorato su Win32, ma devo dare queste classi a
 una terza parte che deve utilizzarle)
Queste classi si attengono abbastanza fedelmente allo standard e
quindi non ho avuto (finora) grossi problemi nel compilare.
Quello che invece mi sta dando delle rogne e' il linking.
Ho scoperto che sotto Win32 la dll deve specificare quali funzioni esportare
e l'eseguibile quali importare (su Unix e' tutto trasparente, quando
il loader non trova un simbolo lo cerca tra le librerie, e le librerie
"esportano" per default tutto).
Quindi saro' costretto ad "inquinare" il mio codice con delle _export e _import.
Gia' questo mi comporta dei problemi:
Come faccio a utilizzare lo stesso file.h sia per importare che per esportare ??
Non basta una semplice #define infatti un header file della libreria A puo'
includerne un'altro della libreria B esportando quindi alcuni simboli e
importandone altri. (queste librerie hanno una gerarchia ad albero)
Prevedo inoltre altri problemi con le istanze dei membri statici delle classi
presenti nelle librerie, ma cerchero' di affrontarli dopo avere risolto questi...
Sono sicuro che chiunque abbia scritto delle DLL su Win32 sapra' aiutarmi
Grazie in anticipo per eventuali consigli e suggerimenti.
*Fabio*
P.S.
Attualmente utilizzo il Borland C++ 5.0 ma dovro' migrare su Visual C++
spero che non ci siano grosse differenze.

Grazie in anticipo per eventuali consigli e suggerimenti.
Non ho mai dovuto scrivere DLL, quindi magari il mio suggerimento e` una 
sciocchezza e non so quanto sia realizzabile, ma hai pensato di lasciare
"intatta" la tua gerarchia di classi e costruirci sopra un wrapper per
renderla utilizzabile come dll da Win32 ?
-- 
Ing. Roberto Gerola
Email: 
robert...@penguinpowered.com
WWW: 
http://www.penguinpowered.com/~The_Cpp_Compass


In Win32 puoi scrivere
---- HEADER
DWORD Foo();
--- DLL ---
DWORD __declspec(dllexport) Foo(){
  return 1;
}
--- DEF FILE
LIBRARY      test
DESCRIPTION "test"
EXPORTS
	Foo @1 PRIVATE
----- MAIN FILE --
#include "foo.h"
int main(){
   rerutn (int)Foo();
}
Quando il compilatore compila la DLL produce lo stub di importazione
(un piccolo file *.LIB). Link quello al tuo file
che deve usare la libreria, e non mettere nulla nel tuo file *.h
che inlcuderai del tuo file *.cpp.
PEr i membri statici di classe, dovrai usare la clausola
__declspec(dllimport), altrimenti il name mangling ti frega.
Sent via Deja.com 
http://www.deja.com/
Share what you know. Learn what you don't.

 wrote: [...] > > Quindi saro' costretto ad "inquinare" il mio codice con delle _export > e _import. > forse di __declspec(dllexport) e __declspec(dllimport) Ho iniziato la mia "missione" con Borland C++ 5, e in quell'ambiente le direttive da usare erano _import e _export. Quello che sono riuscito a fare, alla fine, e' ottenere un unico eseguibile con tutte le classi linkate staticamente all'interno. (Infatti provando a creare una dll, il linker risolveva i simboli delle mie classi, ma non trovava centinaia di simboli della libreria standard). Ma anche cosi' ho avuto dei problemi a run time nell'utilizzo di map<> e threads (se ho piu' di un thread la map<>::insert() manda in crash il programma). Siccome chi dovra' utilizzare le mie classi usera' Visual C++, ho comunque provveduto a istallare Visual Studio 6.0 e ad utilizzare quest'ambiente. In questo caso ho sostituito le _export e _import con le __declspec()  Ma sto incontrando ancora piu' problemi di quelli che ho avuto con il Borland :-( Uno di questi problemi e' nella classe string. Sembra che il Visual C++ non preveda il costruttore     string(const string &s, size_type p, size_type n=npos) ne ha uno simile, ma senza il valore di default per il terzo parametro  (ha come quarto parametro un allocator, con valore di default). Vabbe', non e' grave (anche se un po' seccante) ma a questo punto mi domando cosa prevede lo standard ? Il costruttore con il terzo parametro di default e' presente in egcs, borland e nel compilatore di digital-unix (non ho altri  compilatori) [...] > > Sono sicuro che chiunque abbia scritto delle DLL su Win32 sapra' > aiutarmi > > Grazie in anticipo per eventuali consigli e suggerimenti. [...] > Quando il compilatore compila la DLL produce lo stub di importazione > (un piccolo file *.LIB). Link quello al tuo file > che deve usare la libreria, e non mettere nulla nel tuo file *.h > che inlcuderai del tuo file *.cpp. > PEr i membri statici di classe, dovrai usare la clausola > __declspec(dllimport), altrimenti il name mangling ti frega. Grazie per l'aiuto, ma il momento del link mi appare ancora lontano :-( *Fabio* > Sent via Deja.com 
http://www.deja.com/
 > Share what you know. Learn what you don't. 

 compilatori)
purtroppo non uso la SC++L con il Visual C++, quindi non
posso dire nulla riguardo al costruttore cui ti riferisci.
Pero' sono riuscito a linkare tutto quello che mi ero proposto
di linkare.
