您的位置:首页 > 其它

thread_local_storage.obj : error LNK2001: 无法解析的外部符号 pTlsCallback

2015-12-03 13:58 597 查看
错误描述

      错误信息如标题所示。这个错误出现在将hadoop 2.6.0的libhdfs的C代码转换成一个Visual C++工程进行编译的时候报的错。thread_local_storage.cpp是源码目录os/windows下的源文件(原来是thread_local_storage.c)。

错误的原因

      这是因为thread_local_storage.cpp中有一条预处理指令,

#pragma comment(linker, "/INCLUDE:pTlsCallback")

这是表示将pTlsCallback包含进符号表的意思,这个名字定义的情况如下,

#pragma const_seg(".CRT$XLB")
extern const PIMAGE_TLS_CALLBACK pTlsCallback;
const PIMAGE_TLS_CALLBACK pTlsCallback = tlsCallback;
#pragma const_seg()pTlsCallback是tlsCallback的别名。不过libhdfs原来都是C代码,作为C代码编译pTlsCallback这个符号自然是存在的,但是转换成C++工程编译后,可能就不是这个名字了,因此预处理指令也就不能找到pTlsCallback,那么就会当它是一个外部名字,于是乎就会报“无法解析的外部符号”错误。

解决办法

        声明pTlsCallback的语句略作修改如下:extern "C" const PIMAGE_TLS_CALLBACK pTlsCallback;然后就能顺利编译通过。

附:这个错误似乎很少见,特意贴出来与大家共享。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  linker include LNK2001 VC