混合 C/C++ 源,无法识别链接上的"外部"变量
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
。
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++标准,删除一些结构,但至少它有帮助
相关文章:
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- CMake-按正确顺序将项目与C运行时对象文件链接
- 从链接列表c++中删除一个项目
- 有根的二进制搜索树.保留与其父级的链接
- 读取文件的最后一行并输入到链接列表时出错
- 静态数据成员的问题-修复链接错误会导致编译器错误
- node-gyp 在 macOS 上未正确链接库
- 生成库失败:无法识别文件格式;作为链接器脚本处理
- 如何在目录上迭代并识别或省略NTFS连接(符号链接ish)
- 为什么链接器无法识别此类构造函数?
- g++文件格式无法识别;将Object.o视为链接器脚本
- CMake 链接器无法识别头文件
- 在linux上链接库时,无法识别的选项--kill at
- 链接器是否识别命名空间别名
- 链接c++静态库与android ndk时出错(错误:无法识别文件格式)
- 无法识别文件格式;作为链接器脚本处理
- 识别需要的链接库
- 链接器不能识别某些#include
- 当我将两个头文件链接在一起时,其中一个无法识别另一个
- 混合 C/C++ 源,无法识别链接上的"外部"变量