Domanda

Ehi ragazzi, ho qualche domanda veloce su windows dll.

Fondamentalmente sto usando ifdefs per gestire dllexport e dllimport, la mia domanda riguarda il posizionamento di dllexport e dllimport e la parola chiave esterna.

Sto inserendo dllimports / dllexports nei file di intestazione ma devo mettere dllexport e dllimports sulla definizione attuale?

Che dire di typedefs?

Metto il dllimport / dllexport in primo piano? come in

dllexport typedef map<string, int> st_map

Anche per quanto riguarda la parola chiave extern, l'ho vista in questo modo utilizzata:

extern "C" {

dllexport void func1();

}

Ho anche visto che viene usato in questo modo:

extern dllexport func1();

Uno include la "quot" C " e l'altro no, la mia domanda è qual è la differenza e devo usarla? Se lo faccio, lo uso sia per dllexport che per dllimport, devo usarlo sia sulle dichiarazioni del file di intestazione che sulle definizioni?

Il mio progetto sarà una libreria condivisa, contiene diversi file di classe che voglio esportare, alcuni tipi che voglio esportare e alcune funzioni globali che voglio esportare anche in una dll.

Qualcuno mi illumini per favore?

EDIT:

Va ??bene, ho pensato di pubblicare un piccolo estratto di ciò che ho fatto, inoltre noto che sto costruendo la libreria sia per Linux che per Windows, quindi faccio un controllo per questo:

mydll.h

#ifdef WINDOWS
#   ifdef PSTRUCT_EXPORT
#   define WINLIB __declspec(dllexport)
#   else
#   define WINLIB __declspec(dllimport)
#   endif
#else
#  define WINLIB
#endif

WINLIB void funct1();

Ora nel codice sorgente:

mydll.cpp

#define PSTRUCT_EXPORT

void funct1() <---- do i need to add WINLIB in front of it? 
                      Or is doing it in the header enough?
È stato utile?

Soluzione

Innanzitutto, non è necessario importare o esportare i typedef. Finché sono nei file di intestazione che utilizzano entrambe le parti, sei bravo. È necessario importare / esportare funzioni e definizioni di classe.

Presumibilmente usi gli stessi file di intestazione sia per il codice di importazione che di esportazione, quindi potresti fare un po 'di magia makefile per definire una macro preprocessore su ciascun lato, quindi fare qualcosa del genere:

#if defined( LIBRARY_CODE )
#define MYAPI __declspec(dllexport)
#else
#define MYAPI __declspec(dllimport)
#endif

extern MYAPI void func1();
class MYAPI MyClass {
    ...
};

Per quanto riguarda le funzioni C vs. C ++, puoi farlo:

#if defined( __cplusplus__ ) // always defined by C++ compilers, never by C
#define _croutine "C"
#else
#define _croutine
#endif

extern _croutine void function_with_c_linkage();

Assicurati di importare questo file di intestazione dal tuo file sorgente C ++ (contenente l'implementazione di questa funzione) o il compilatore non saprà dargli il collegamento C.

Altri suggerimenti

  1. i typedef NON hanno bisogno di un dllimport / dllexport, è solo una definizione
  2. dllimport / dllexport non sono standard, pensa a definire una macro per altre piattaforme / compilatori
  3. prenditi anche cura della convenzione di chiamata (cdecl, stdcall, ...) utilizzata altrimenti incontrerai dei problemi (se hai bisogno di essere interoperabile con Visual Basic usa stdcall)
  4. racchiudere in "& C;" esterni in modo che la tua lib possa essere usata dai programmi C ++, usa #ifdef __cplusplus per renderla visibile solo al C ++.

Dai un'occhiata alle diverse librerie OpenSource. Lì troverai molti esempi su come realizzare una buona intestazione della libreria. Potrebbero esserci problemi con la decorazione del nome nel caso di C ++ senza l'esterno "C".

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top