PDA

Visualizza la versione completa : [c++]problema dll e warning


giuseppe500
19-12-2012, 12:28
ciao.
Ho creato una dll con una classe definita cosi:


class OPENCL_ITEM CClProgram

dove: #define OPENCL_ITEM __declspec(dllexport)

tutto funziona correttamente , solo ho questi warning per delle variabili private membro di cui non ho definito i getter e setter perchè non mi servono allo scopo della classe.


c:\open\open\openclwrapper\clprogram.h(18): warning C4251: 'CClProgram::m_strSource' : class 'std::basic_string<_Elem,_Traits,_Ax>' needs to have dll-interface to be used by clients of class 'CClProgram'


c'è un modo per evitare i warning?

grazie.

shodan
19-12-2012, 14:43
Il warning mi pare abbastanza chiaro e non ha niente a che fare con i metodi getter e setter, ma con la classe std::basic_string che non ha una DLL interface. Però non so che dirti per risolvere. Io quando creo DLL non esporto mai classi ma solo funzioni factory.

Comunque se crei la DLL il quel modo, sappi che potrai usarla solo col compilatore con la quale la compili. In altre parole se la compili con VC++ 2003 non potrai riciclarla (senza ricompilarla di nuovo) in VC++ 2005 o superiori e viceversa.

giuseppe500
19-12-2012, 14:50
grazie, shodan.
Quindi per creare una dll che possa usare nelle future versioni di vc++ come devo fare?
dici di esportare funzioni factory , ma dopo gli oggetti che crea questa factory sono oggetti pari pari a quelli che creerei instanziando la classe esportata della dll?
come gestire i .h?tutti nella factory puo funzionare?
hai un esempio o un link?
ciao.

shodan
19-12-2012, 15:59
Il link mi pare di avertelo già indicato, comunque è questo:
http://chadaustin.me/cppinterface.html

In sostanza si tratta di utilizzare una classe interfaccia astratta lato client e una implementazione di tale interfaccia lato DLL. I parametri da client a DLL devono essere solo primitive C, struct stile C o interfaccie astratte a classi di cui devi fornire un'implementazione lato client. Le eccezioni non devono uscire dalla DLL.

La funzione factory deve restituire un puntatore raw (di tipo interfaccia astratta) alla classe implementata nella DLL (che deve a sua volta implementare l'interfaccia astratta).
Come tocco raffinato puoi scegliere se implementare l'operatore delete come mostrato nel link oppure chiamare direttamente il metodo destroy() dell'intefaccia astratta.
Personalmente preferisco la prima opzione.

Il tutto va compilato (almeno io lo faccio) con la static library del compilatore, non con la DLL di runtime, in modo da avere una DLL fatta e finita che non ha bisogno della DLL specifica di runtime (che varia da versione a versione).

Fatto questo, la DLL è portabile e puoi usarla con qualsiasi versione di VC++.

Loading