混合 C/C++ 来源,无法识别链接上的 'extern' 变量
Mixed C/C++ sources, doesn't recognize 'extern' variables on linkage
我有一个 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 源代码 int create_source(char * buf)
中的函数应该从中调用此函数不在 extern "C" { }
块或类似的任何东西中。
如果我了解你,我认为你的问题不是来自C和C++语言的混合。事实上,全局变量必须在不带关键字 extern 的单个文件中声明,并且在任何其他具有该关键字的文件中声明。
不要更改文件“func_def.h”中的任何内容,但要确保 typedef 已被识别。与 C++ 一样小心处理。
放置文件指令的开头
#ifdef __cplusplus
extern "C" {
#endif
和文件指令的末尾
#ifdef __cplusplus
}
#endif
在您的一个 .c 文件中,使用指令
定义外部
这将有效地删除单个文件中的关键字。
此致:伯纳德。
我解决了这个问题,方法是将所有原型函数声明都放在块 "extern "C" { }" 中。我不得不修改 C 代码,使其符合 C++ 标准,删除一些结构,但至少它有所帮助
我有一个 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 源代码 int create_source(char * buf)
中的函数应该从中调用此函数不在 extern "C" { }
块或类似的任何东西中。
如果我了解你,我认为你的问题不是来自C和C++语言的混合。事实上,全局变量必须在不带关键字 extern 的单个文件中声明,并且在任何其他具有该关键字的文件中声明。 不要更改文件“func_def.h”中的任何内容,但要确保 typedef 已被识别。与 C++ 一样小心处理。 放置文件指令的开头
#ifdef __cplusplus
extern "C" {
#endif
和文件指令的末尾
#ifdef __cplusplus
}
#endif
在您的一个 .c 文件中,使用指令
定义外部
这将有效地删除单个文件中的关键字。
此致:伯纳德。
我解决了这个问题,方法是将所有原型函数声明都放在块 "extern "C" { }" 中。我不得不修改 C 代码,使其符合 C++ 标准,删除一些结构,但至少它有所帮助