2009-04-11 2 views
3

Я хотел бы создать библиотеку dll от C++ и использовать его в C. Я хотел бы экспортировать только одну функцию:C++ dll в программе C

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

Заголовочный файл из библиотеки:

#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__ 

в .cpp (в библиотеке проекта) функция также объявлена ​​как:

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

Файл .lib добавлен в опции проекта VS (Linker/Input/Additional dependencies). .dll находится в папке, где находится .exe. Когда я компилирую проекта C - ошибка:

Error 1 error C2059: syntax error : 'string'  

Речь идет о части «Экстерн„C“» в файле заголовка.

Я пытался изменить файл заголовка к:

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

затем

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 : ')' 

и даже когда я изменил & к * появился:

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

Я не знаю, почему это неправильно. .lib .h и .dll добавлены правильно.

+0

Я нашел ответ на: Ошибка 6 Ошибка LNK2019: неразрешенный внешний символ _load_obj ссылки в функции _MAIN main.obj Потому что я компиляции проекта библиотеки статической библиотеки, а затем к DDL библиотеке и accidentyl .lib был заменен на меньший, созданный библиотекой dll ... – mmatloka

ответ

11

Параметр «GLuint &object_list» означает «передать ссылку на GLuint здесь». C не имеет ссылок. Вместо этого используйте указатель.

// 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 не имеет ссылок, как указал Давид.

Кроме того, выньте наружную "C". C не использует и не знает об этом.

Если вам необходимо разделить заголовок, сделать что-то вроде:

#ifdef __cplusplus 
    extern "C" { 
#endif 

/* extern "C" stuff */ 

#ifdef __cplusplus 
    } 
#endif 

В C, __cplusplus не будет определен.

Смежные вопросы