gcc (GCC) 4.7.2
Ciao,Creazione di una libreria portabile per l'esecuzione su Linux e Windows
sto creando una libreria condivisa che compilerà su Linux e una dll che compilerà su Windows utilizzando lo stesso codice sorgente. Quindi sto creando una libreria portatile per Linux e Windows.
Nel mio file di intestazione per la libreria è presente cioè module.h
#ifdef __cplusplus
extern "C" {
#endif
#ifdef _WIN32
#define LIB_INTERFACE(type) EXTERN_C __declspec(dllexport) type
#else
#define LIB_INTERFACE(type) type
#endif
LIB_INTERFACE(int) module_init();
#ifdef __cplusplus
}
#endif
In origine ho il seguente cioè module.c
#include "module.h"
LIB_INTERFACE(int) module_init()
{
/* do something useful
return 0;
}
E nella mia applicazione di test che collegherà e utilizzare questa module.so ho questo:
#include "module.h"
int main(void)
{
if(module_init() != 0) {
return -1;
}
return 0;
}
1) è quello che ho fatto sopra è una corretta ESECUZIONE creazione di una libreria portatile per linux e windows?
2) Mi sto solo chiedendo come ho avvolto le funzioni in extern "C"
in modo che questa libreria possa essere chiamata da un programma che è stato compilato in C++. Ho ancora bisogno di questo EXTERN_C
il seguente:
#define LIB_INTERFACE(type) EXTERN_C __declspec(dllexport) type
3) Qual è lo scopo della EXTERN_C
?
Molte grazie in anticipo,
È una macro che si risolve in "extern" C "' per la compilazione C++ e "extern" o nulla per la compilazione C. (Onestamente non riesco a ricordare quale, ma evidenziarlo e premere F12, dovrebbe portarti alla definizione attuale). È * lo scopo * è di istruire il compilatore per rimuovere il manichino di nome C++ dal simbolo che viene esportato dalla libreria. E no, se hai già l'intero header avvolto in "extern" C "{" puoi eliminarlo (assumendo che gcc capisca lo stesso block-extern-C, e di nuovo, onestamente non ricordo se lo fa). – WhozCraig
Leggete [questo] (http://gcc.gnu.org/wiki/Visibility). Potresti voler usare questo meccanismo. –
@ ant2009 La libreria deve essere utilizzata da C oppure è possibile limitarla a C++ 11? –