错误描述
错误信息如标题所示。这个错误出现在将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;
然后就能顺利编译通过。
附:这个错误似乎很少见,特意贴出来与大家共享。