在C程序中使用C++动态链接库

4

我想从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...
}

在 VS 项目选项中添加 .lib 文件(链接器/输入/附加依赖项)。.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已经正确添加了。


我找到了一个答案:由于我正在将库项目编译为静态库,然后再编译为ddl库,意外地用dll库创建的较小的.lib替换了它...导致错误6:error LNK2019:在函数_main中引用未解析的外部符号_load_obj。 - mmatloka
2个回答

12

参数 "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...
}

4

正如David所指出的那样,C语言没有引用。

此外,去掉extern "C"。C语言不需要也不知道它的存在。

如果你需要共享头文件,可以采取以下方法:

#ifdef __cplusplus
    extern "C" {
#endif

/* extern "C" stuff */

#ifdef __cplusplus
    }
#endif

在C语言中,__cplusplus不会被定义。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接