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中有一条预处理指令,
这是表示将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;然后就能顺利编译通过。
附:这个错误似乎很少见,特意贴出来与大家共享。
错误信息如标题所示。这个错误出现在将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;然后就能顺利编译通过。
附:这个错误似乎很少见,特意贴出来与大家共享。
相关文章推荐
- Ruby中require、load、include、extend的区别介绍
- vbscript include的办法实现代码第1/2页
- VC中CDC、HDC、pDC区别与联系及相互转换
- VC实现获取当前正在运行的进程
- vc中SendMessage自定义消息函数用法实例
- VC实现让关闭按钮成灰色不可用的方法
- VC++中的字体设置方法详解
- VC程序设计中CreateProcess用法注意事项
- VC实现批量删除指定文件的方法
- vc中使用SendMessage自定义消息函数
- vc提示unexpected end of file found的原因分析
- vc获取计算机名和ip地址的方法
- VC6.0实现读取Excel数据的方法
- 解析C++编程中的#include和条件编译
- VC下通过系统快照实现进程管理的方法
- PHP脚本中include文件出错解决方法
- Flex include和import ActionScript代码
- set_include_path在win和linux下的区别
- VC实现Windows多显示器编程的方法
- php include加载文件两种方式效率比较