c++ - 混合 C/C++ 源,无法识别链接上的 'extern' 变量

标签 c++ c linker global-variables extern

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

文件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 文件中使用它: 解析器.c:

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

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

但我收到错误LNK2001无法解析的外部符号DllReParseHtml

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

最佳答案

如果我理解你的意思,我不认为你的问题来自于 C 和 C++ 语言的混合。事实上,全局变量必须在不带关键字 extern 的单个文件以及任何其他带有该关键字的文件中声明。 不要更改文件“func_def.h”中的任何内容,但确保可以识别 typedef。对 C++ 造成损坏同样要小心。 放置文件指令的开头

#ifdef __cplusplus
    extern "C" {
#endif

以及文件末尾指令

#ifdef __cplusplus
    }
#endif

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

定义外部

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

问候:伯纳德。

关于c++ - 混合 C/C++ 源,无法识别链接上的 'extern' 变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38995963/

相关文章:

c++ - 为 Vim 调整 C++ IDE 插件

c - C中的猜谜游戏,无法获得有效的尝试次数,变量为 "counter"

c - 在 C 程序中列出全局数组变量

c++ - 扩展 std::list

c++ - 不满意链接错误 : undefined symbol _ZN5boost6system16generic_categoryEv in java (JNI)

C++ 将类型作为未知类函数的参数?

c++ - 运算符重载错误

c++ - 排序 CMFCListCtrl 时的奇怪(?)行为

C编程输入错误

c++ - MSVC : Using link. 手动执行