2009-04-11 8 views
3

C++コードからdllライブラリを作成してCプログラムに使用したいと思います。 私は唯一の関数をエクスポートしたいと思います:ライブラリーからCプログラム内のC++ DLL

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

ヘッダファイル:

extern "C" GLboolean load_obj (const char *filename, GLuint &object_list) 
{ 
code... 
} 
:.cppファイルで

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

は、関数(ライブラリプロジェクトに)としても宣言されています

ファイル.libがVSプロジェクトオプション(リンカー/入力/追加の依存関係)に追加されています。 .dllは.exeがあるフォルダにあります。私はCプロジェクトコンパイルすると - エラー:

Error 1 error C2059: syntax error : 'string'  

をそれは、ヘッダー・ファイル内の一部約 "のextern "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:未解決の外部シンボル私は静的ライブラリにライブラリプロジェクトをコンパイルしたため、関数_mainのMAIN.OBJ で参照して、DDLライブラリとaccidentyl .libファイルにした_load_obj 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には参照がありません。

さらに、extern "C"を取り出してください。 Cはそれについての使用も知りもしていません。あなたは、ヘッダーを共有する必要がある場合

、ような何か:Cで

#ifdef __cplusplus 
    extern "C" { 
#endif 

/* extern "C" stuff */ 

#ifdef __cplusplus 
    } 
#endif 

を、__cplusplusが定義されることはありません。