混合的C / C ++来源,不认识' extern'关联的变量

时间:2016-08-17 11:56:13

标签: c++ c linker global-variables extern

我有C ++项目,其中我添加了一些纯C gnu库。我的任务是更改一些函数,这些函数用于那些需要从dll动态加载的函数,所以我做的是,我声明了原型,并创建了一个外部变量:

文件 prototypes.h

typedef char *( __cdecl * _ReParseHtml ) ( DOM * data )

文件 func_defs.h

extern _ReParseHtml DllReParseHtml;

然后在我的主文件 program.cpp 中声明:

_ReParseHtml DllReParseHtml;

int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
    _In_opt_ HINSTANCE hPrevInstance,
    _In_ LPWSTR    lpCmdLine,
    _In_ int       nCmdShow)
{
    HINSTANCE hDLL = LoadLibrary("somelib.dll");
    if(hDll != 0){
         DllReParseHtml = (_ReParseHtml)GetProcAddress(hDLL,
                                       "ReParseHtml");
         //etc
    }
}

所以现在我想在我添加的纯.c文件中使用它: 的 parser.c

#include "func_defs.h"  // here is the extern _ReParseHtml DllReParseHtml;

 int create_source(char * buf)
 {
      char * modified = DllReParseHtml(buf);
      // etc..
 }

但我收到错误LNK2001 unresolved external symbol DllReParseHtml

要从中调用此函数的purce C source int create_source(char * buf)中的函数不在extern "C" { }块中,或类似的内容。

2 个答案:

答案 0 :(得分:0)

如果我理解你,我认为你的问题不是来自C和C ++语言的混合。实际上,必须在单个文件中声明全局变量,而不使用关键字extern和具有该关键字的任何其他文件。 不要更改文件“func_def.h”中的任何内容,但要确保识别typedef。使用C ++进行同样的关注会让人感到痛苦。 放置文件指令的开头

#ifdef __cplusplus
    extern "C" {
#endif

并在文件指令的末尾

#ifdef __cplusplus
    }
#endif

在您的一个.c文件中,使用指令

定义extern

这将有效地删除单个文件中的关键字。

问候:伯纳德。

答案 1 :(得分:0)

我通过在块“extern”C“{}”中创建所有原型函数声明来解决这个问题。我不得不修改C代码,修改c ++标准,删除一些结构,但至少它有帮助