【问题标题】:Mixed C/C++ sources, doesn't recognize 'extern' variables on linkage混合 C/C++ 源,无法识别链接上的“外部”变量
【发布时间】:2016-08-17 11:56:13
【问题描述】:

我有一个 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

假定调用此函数的源 C 源代码 int create_source(char * buf) 中的函数不在 extern "C" { } 块或类似的块中。

【问题讨论】:

  • 需要,更多,逗号,to,be,可读。
  • 您可能需要在您的 program.cpp 中添加extern "C",因为您需要它。您也可以将_ReParseHtml DllReParseHtml; 移动到您的 parser.c 而不是您的 program.cpp
  • @Elijan9 我需要在项目的其他几个 C 文件中使用它。这就是为什么我这样宣布
  • @KlasLindbäck 它不是 dll。我只有c++ 项目,我在其中使用了一些纯C 代码。在那个纯 C 代码中,我需要访问在我的项目中声明的全局变量。在我的帖子中,全局变量是从WinMain 中的dll 动态加载的函数。

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


【解决方案1】:

如果我理解你,我不认为你的问题来自 C 和 C++ 语言的混合。事实上,全局变量必须在没有关键字 extern 的单个文件中声明,而在任何其他文件中都必须使用该关键字。 不要更改文件“func_def.h”中的任何内容,但要确保 typedef 被识别。对 C++ 采取同样的谨慎态度会造成混乱。 放置文件指令的开头

#ifdef __cplusplus
    extern "C" {
#endif

在文件指令的末尾

#ifdef __cplusplus
    }
#endif

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

定义外部

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

问候:伯纳德。

【讨论】:

    【解决方案2】:

    我解决了这个问题,将所有原型函数声明都放在块 "extern "C" { }" 中。我不得不将 C 代码修改为 c++ 标准,删除一些结构,但至少它有所帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-20
      • 2012-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多