2016-04-11 16 views
0

Nachdem ich ein Assignment beendet hatte, in dem man ein Win32-Fenster implementieren musste, wollte ich meine Funktionen in eine DLL exportieren.C Funktionen werden nicht exportiert

Überraschenderweise klagt der Linker über unreferenced Links, altough

  • __declspec (dllexport)/__declspec (dllimport) definiert und verwendet, richtig (oder wie früher werde von C++).
  • Die Bibliothek ist korrekt für den Linker angegeben.
  • Die Funktionen sind in Abhängigkeit Walker sichtbar.

Der Linker beschwert sich immer (in Deutsch):

Fehler LNK2019: Verweis auf nicht aufgel ÷ stes externes Symbol "" __declspec (dllimport) struct cw_Window * __cdecl create (char *, ohne Vorzeichen kurz, unsigned kurz) "(__imp_? createWindow @@ YAPEAUcw_Window @@ PEADGG @ Z) in Funktion" main ". C: \ Benutzer \ jkirs \ Desktop \ Workspace \ MSVC2015_x86_64-release \ Unit.MSVC2015-x86-64.88a6cdd3 \ intermediate.Unit.exe : fatal error LNK1120: 1 nicht aufgel ÷ ste Externe

Meine Funktionen Prototypen werden wie folgt definiert:

typedef struct cw_Window cw_Window_t; 
typedef struct cw_Event  cw_Event_t; 

API cw_Window_t* createWindow(char* pTitle, uint16_t nWidth, uint16_t nHeight); 
API void   destroyWindow(cw_Window_t* pWindow); 
API void   pollEvent(cw_Window_t* pWindow, cw_Event_t* pEvent); 

wo als "API" wird wie folgt definiert:

#ifdef _MSC_VER 
    #ifdef CW_EXPORT 
     #define API __declspec(dllexport) 
    #else 
     #define API __declspec(dllimport) 
    #endif 
#else 
    #define API // TODO 
#endif 

ich versuchte ‚extern "C" auf die 'API' Definition hinzuzufügen, als auch, wit hout ein Ergebnis, aber beschwert sich über das String-Literal "C".

Ist schon jemand auf dieses Thema gestoßen und kann mich in die richtige Richtung weisen?

Wenn es darauf ankommt: Ich bin Visual Studio C++ 2015 (MSVC_x86_64); Meine Header-Dateien enden mit '.h' und die Quelldateien enden mit '.c'.

EDIT: Die Lib soll wieder in C-Code verwendet werden.

Antwort

0

Schließlich war alles, was ich machte, nur in Ordnung, aber das Build-System. Stellt fest, das das Buildsystem die Datei als eine C++ - Quelldatei anstelle von Ebene C behandelt.

0

So scheint es, dass Sie das grundlegende Problem und die ungefähre Lösung mit extern "C" kannten. Aber dein Fehler ist: setze extern "C" nicht in die API-Definition. Wickeln Sie die Definitionen und Erklärungen mit ihm:

typedef struct cw_Window cw_Window_t; 
typedef struct cw_Event  cw_Event_t; 

extern "C" { 
API cw_Window_t* createWindow(char* pTitle, uint16_t nWidth, uint16_t nHeight); 
API void   destroyWindow(cw_Window_t* pWindow); 
API void   pollEvent(cw_Window_t* pWindow, cw_Event_t* pEvent); 
} 

Ich weiß, es sieht aus wie extern und was Sie versuchen, scheint wie eine vernünftige Stelle setzen extern, aber extern "C" ist ein anderes Tier mit unterschiedlichen Regeln; Sie können hier mehr darüber lesen, als Sie möchten In C++ source, what is the effect of extern "C"?