2009-04-11 22 views
3

Ich möchte eine DLL-Bibliothek aus C++ Code erstellen und verwenden Sie in C Programm. Ich möchte nur eine Funktion exportieren:C++ DLL in C-Programm

GLboolean load_obj (const char *filename, GLuint &object_list); 

Header-Datei aus der Bibliothek:

#ifndef __OBJ__H__ 
#define __OBJ__H__ 

#include <windows.h> 
#include <GL/gl.h> 
#include <GL/glext.h> 
#include <GL/glu.h> 
#include <GL/glut.h> 

#if defined DLL_EXPORT 
#define DECLDIR __declspec(dllexport) 
#else 
#define DECLDIR __declspec(dllimport) 
#endif 

extern "C" GLboolean load_obj (const char *filename, GLuint &object_list); 

#endif // __3DS__H__ 

in CPP (in Bibliotheksprojekt) Funktion wird auch erklärt, wie:

extern "C" GLboolean load_obj (const char *filename, GLuint &object_list) 
{ 
code... 
} 

Datei .lib wird in VS-Projektoptionen hinzugefügt (Linker/Eingabe/Zusätzliche Abhängigkeiten). .dll befindet sich in dem Ordner, in dem sich .exe befindet. Wenn ich kompilieren C-Projekt - Fehler:

Error 1 error C2059: syntax error : 'string'  

Es handelt sich um einen Teil "extern "C"" in Header-Datei.

Ich habe versucht, auf Header-Datei zu ändern: dann

Error 1 error C2143: syntax error : missing ')' before '&' 
Error 2 error C2143: syntax error : missing '{' before '&' 
Error 3 error C2059: syntax error : '&' 
Error 4 error C2059: syntax error : ')' 

und sogar

extern GLboolean load_obj (const char *filename, GLuint &object_list); 

wenn ich & geändert zu * erschienen:

Error 6 error LNK2019: unresolved external symbol _load_obj referenced in function _main main.obj  

I‘ Ich habe keine Ahnung, warum es falsch ist. .lib .h und .dll werden ordnungsgemäß hinzugefügt.

+0

Ich habe eine Antwort finden: Fehler 6 Fehler LNK2019: nicht aufgelöstes externes Symbol _load_obj in Funktion _main verwiesen main.obj Weil ich Bibliotheksprojekt statische Bibliothek kompiliert wurde und dann Bibliothek DDL und accidentyl Lib war ersetzt durch eine kleinere von der DLL-Bibliothek erstellt ... – mmatloka

Antwort

11

Der Parameter "GLuint &object_list" bedeutet "hier einen Verweis auf einen GLuint übergeben". C hat keine Referenzen. Verwenden Sie stattdessen einen Zeiger.

// declaration 
extern "C" GLboolean load_obj (const char *filename, GLuint *object_list); 

// definition 
GLboolean load_obj (const char *filename, GLuint *object_list) 
{ 
    code... 
} 
3

C hat keine Referenzen, wie David betont.

Zusätzlich extern "C" herausnehmen. C hat keinen Nutzen und kennt es auch nicht.

Wenn Sie die Header teilen müssen, so etwas wie:

#ifdef __cplusplus 
    extern "C" { 
#endif 

/* extern "C" stuff */ 

#ifdef __cplusplus 
    } 
#endif 

In C __cplusplus wird nicht definiert werden.