Newsgroup: it.comp.programmare.win32
Titolo: Problema linkaggio DLL

Ciao,
ho un software che funziona bene se includo la classe come
sorgente. SE la tolgo, per usare una DLL che la incapsula,
VC6 mi da il seguente errore:
Linking...
.\engine.lib : fatal error LNK1136: invalid or corrupt file
Error executing link.exe.
La libreria DLL è costruita con il CBuilder6 così come il suo
corrispettivo file .lib che viene incluso nel primo progetto!
Qualcuno mi sa illuminare sul problema del link??
Grazie a tutti

 corrispettivo file .lib che viene incluso nel primo progetto!
Se ho ben capito stai utilizzando una LIB creata con BCB in VC. 
Questo direttamente non lo puoi fare, è un classico problema 
dovuto al diverso formato utilizzato dai due compilatori (OMF il 
primo, COFF il secondo). Con BCB viene fornito un tool di 
conversione COFF2OMF, in questo caso a te servirebbe il 
contrario, probabilmente in rete trovi qualcosa. Oppure, link 
dinamico con la DLL.
Steve. 

 dinamico con la DLL.
Ti ringrazio per la risposta...quindi se uso la DLL in modo dinamico,
non mi dovrebbe dare questo problema!?
Io pensavo che anche la DLL fosse compromessa...
Inoltre ho usato la implib della borland con l'opzione -a (compatibilità 
con VC) per creare il file .lib: ma da sempre lo stesso problema!
Cmq ora risolvo con il linkaggio dinamico! ;-)
Grazie

 lo stesso problema!
Con IMPLIB crei un file LIB da una DLL, ma il LIB generato va 
bene per BCB, non per VC.
Steve. 

 l'ha realizzata abbia considerato un po' la compatibilità.
Beh...siamo a cavallo! La DLL l'ho creata io! ;-)

> Beh...siamo a cavallo! La DLL l'ho creata io! ;-)
Allora mi viene una curiositą, per quale motivo devi utilizzare 
un mix tra VC e BCB per realizzare l'applicazione? Non potevi 
fare tutto in un ambiente?
Steve. 

 fare tutto in un ambiente?
Beh ci posso anche stare ad usare il VC. Ma sai sono attratto molto
di più dal CBuilder6 ;-)
Una cosa: la mia dll, sia essa in VC o CBuilder, è praticamente una 
classe che incapsula tutto il lavoro...come faccio ad aprire la DLL
ed esportare le funzioni??? Non c'è un modo per esportare l'intera
classe??

 classe??
Esportare la classe da una DLL è arduo, se poi la importi con un 
compilatore diverso... brrr... diciamo che lascerei perdere. 
Nulla, fatti tutte le funzioni che ti servono che internamente 
andranno a richiamare i metodi della classe, non vedo molte 
altre soluzioni. Chiaro che era meglio prevedere che si sarebbe 
messo tutto in una DLL... Torno con il tormentone, perchè non 
fare tutto in BCB vista anche la situazione?
Steve. 

 altre soluzioni.
esportare una classe da una DLL si può: in VC++ penso che bisogna
dichiararla con __declspec(dllexport) (o con __declspec(dllimport), a
seconda che l'header venga usato nella compilazione della DLL o dell'EXE,
rispettivamente). il problema è che il layout delle classi Microsoft
sicuramente non coincide con quello Borland, quindi credo che il mix non
si possa fare.
in genere quando divido i miei programmi in più moduli programmo sempre in
C almeno le DLL; poi l'EXE casomai lo faccio a oggetti. e comunque
utilizzo *un solo* compilatore... :D
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 utilizzo *un solo* compilatore... :D
Scelta che condivido abbastanza.
Steve. 

 C almeno le DLL; 
Anche io faccio così: però una cosa è un progetto che per definizione si 
può dividere in funzioni; un'altra è un progetto che per natura è 
definita come un oggetto. Non so se mi sono spiegato bene :-)

 Invece penso che il mix si possa fare, difficile, ma si deve fare!
Bisogna disabilitare il "name mangling" operato dal compilatore.
I compilatori C++ "decorano" i nomi dei membri, inserendo delle
informazioni che consentono di mantenere il tutto type-safe.  Questo però
rende incompatibile il binario finale tra un compilatore all'altro, perché
non ci sono regole standard per la decorazione dei nomi.  Si disabilita la
decorazione dei nomi usando la direttiva extern "C" { ... }.


 
Certo la direttiva già la applico...
Il problema è capire come si esporta l'intera Classe!

 compilatore.
Sempre IMHO non basta. Tempo fa avrei dovuto fare qualcosa di 
simile, ma dopo che sul Web ho trovato parecchi riferimenti al 
problema specifico senza alcuna soluzione, ho lasciato perdere.
In questo caso la LIB/DLL è possibile ricompilarla quindi magari 
c'è qualche possibilità in più, soprattutto perchè si conoscono 
le classi. Resta il fatto che non è ancora stato detto perchè 
mai si stanno utilizzando due ambienti diversi.
Steve. 

 decorazione dei nomi usando la direttiva extern "C" { ... }.
a parte che si, bisognerebbe anche fare quello che dici, ma anche
facendolo secondo me non è comunque possibile importare una classe C++
generata da un altro compilatore; pensa ad esempio al costruttore: anche
ammettendo che si sia riusciti a stabilire la compatibilità tra tipi, il
costruttore Microsoft genera un oggetto con un layout da interpretarsi
differentemente da come lo farebbe un costruttore Borland; ad es. che ne
sai di come viene sistemata la tabella delle funzioni virtuali, di che
formato ha, ecc.?
