2009-06-09 2 views
8

Sto pianificando di utilizzare le librerie nel mio programma C++. Lo sviluppo sta accadendo su Linux ma l'applicazione è progettata per compilare sia su Linux che su Windows. Capisco l'equivalente diretto per le librerie condivise (.so) in Windows è DLL, giusto?Creazione di librerie di programmi in Windows e LINUX [C++]

In Linux utilizzando g ++, posso creare una libreria condivisa usando i flag -fPIC e -shared. AFAIK, non sono necessari altri cambiamenti di codice per una libreria condivisa. Ma le cose sono diverse in una DLL di Windows. Dovrei specificare le funzioni che devono essere esportate usando dllexport, giusto?

La mia domanda è come posso gestire questa situazione? Voglio dire dllexport non è valido in Linux e il compilatore darà un errore. Ma è richiesto in Windows. Quindi, come posso scrivere una funzione che verrà compilata su entrambe le piattaforme senza alcun cambio di codice?

compilatori utilizzato

  • g ++ - LINUX
  • VC++ - Windows

Qualsiasi aiuto sarebbe grande!

risposta

9

Specifichiamo __declspec(dllexport) per la classe:

#define EXPORT_XX __declspec(dllexport) 

class EXPORT_XX A 
{ 
}; 

È possibile quindi controllare per la piattaforma e definire solo la macro sulle finestre. Es .:

#ifdef WIN32 
#define EXPORT_XX __declspec(dllexport) 
#else 
#define EXPORT_XX 
#endif 

Abbiamo principalmente costruire librerie statiche quindi ci potrebbe essere più roba da fare per librerie dinamiche, ma il concetto è lo stesso - macro preprocessore impiegato per definire stringa che è necessario inserire nel codice di Windows.

+0

Grazie. Quale sarà il tipo di DLL creato in Windows? Sarà una dll COM? Ci sono possibilità di imbattersi in problemi di inferno della DLL? –

+0

L'uso di dllexport non causa l'esposizione della dll al sistema COM. Le probabilità di inferno dipendono da come si distribuisce la DLL e l'applicazione. Se installi sempre le DLL richieste dall'app, il problema relativo a questa DLL non è un problema. –

+0

@sean e: Grazie. Installerò sempre l'app della DLL richiesta nella directory dell'applicazione. A volte ci possono essere piccoli aggiornamenti che sostituiranno solo una DLL piuttosto che l'intera applicazione. Sarà un problema? –

2

È possibile utilizzare la direttiva preprocessore #ifdef per la compilazione condizionale. Per esempio:

#ifdef WIN32 
    // Win32 specific code 
#else 
    // Elsewhere 
#endif 
5

Un'altra alternativa è utilizzare solo un file .def per il progetto Windows. Questo file specifica le esportazioni della DLL, quindi non dovrai rovinare il tuo codice base. (Ma le macro sono sicuramente la strada da percorrere se si vuole evitare il file extra.)

+0

L'uso dei simboli C++ nei file .def può diventare piuttosto complicato. –

+0

Dipende da cosa sta facendo, se per biblioteche intende una sorta di architettura di plugin, è meglio con un'interfaccia C e i file .def funzionerebbero. – diapir

1

Un'altra opzione, quella che uso ora, è quella di utilizzare MinGW su Windows. In questo modo puoi usare gcc su Windows e non devi preoccuparti delle sciocchezze di declspec.

+1

Grazie per la risposta. Bene, questa è un'applicazione open source e voglio supportare un'ampia gamma di compilatori per compilare correttamente l'applicazione. Quindi immagino che tutte queste sciocchezze siano necessarie. –