混合 C/C++ 源,无法识别链接上的"外部"变量

Mixed C/C++ sources, doesn't recognize 'extern' variables on linkage

本文关键字:链接 识别 外部 变量 C++ 混合      更新时间:2023-10-16

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

puce C源int create_source(char * buf)中假定调用该函数的函数不在extern "C" { }块中,或者类似的东西

如果我理解你的话,我不认为你的问题来自C和c++语言的混合。事实上,全局变量必须在一个不带关键字extern的文件中声明,并在任何其他带有该关键字的文件中声明。不要更改文件中的任何内容"func_def.h"但要确保typedef被识别。在c++中,同样要小心创建一个mangle。放置文件指令

的开头
#ifdef __cplusplus
    extern "C" {
#endif

和文件结束指令

#ifdef __cplusplus
    }
#endif
在你的。c文件中,使用指令 <标题>定义走读生h1> 将有效地删除单个文件中的关键字。

问候:伯纳德。

我解决了这个问题,通过使所有的原型函数声明在一个块"extern "C"{}"。我不得不修改C代码,以符合c++标准,删除一些结构,但至少它有帮助