转自:
http://blog.sina.com.cn/s/blog_591f0e6e010008o7.html
http://www.cnblogs.com/moodlxs/archive/2012/10/16/2725329.html
zthread库简介
ZThread库是一个开源的跨平台高级面向对象的线程和synchronization 库,以运行POSIX 和Win32 系统中的C++程序。
ZThread库的主页:http://zthread.sourceforge.net
最新版本Zthread源码下载地址: http://prdownloads.sourceforge.net/zthread/ZThread-2.3.2.tar.gz
ZThread文档:http://zthread.sourceforge.net/documentation.html
问题描述
zthread库(version 2.3.2)在gcc 3.4.2下编译,错误提示如下
g++ -DHAVE_CONFIG_H -I. -I. -I. -I../include -g -O2 -Wall -DNDEBUG -g -O2 -Wall -DNDEBUG -MT AtomicCount.lo -MD -MP -MF .deps/AtomicCount.Tpo -c AtomicCount.cxx -fPIC -DPIC -o .libs/AtomicCount.o In file included from vanilla/SimpleAtomicCount.cxx:26, from AtomicCount.cxx:55: ../include/zthread/Guard.h: In destructor `ZThread::Guard<LockType, LockingPolicy>::~Guard()': ../include/zthread/Guard.h:494: error: there are no arguments to `isDisabled' that depend on a template parameter, so a declaration of `isDisabled' must be available ../include/zthread/Guard.h:494: error: (if you use `-fpermissive', G++ will accept your code, but allowing the use of an undeclared name is deprecated)
问题分析
查看include/zthread/guard.h, 模板类Guard<LockType, LockingPolicy> 私有继承于 private LockHolder<LockType>, private NonCopyable;这个是编译器编译器版本的问题.印象里Zthread的作者已经停止开发一段时间了.
g++3.4以后版本的名字查找方法和以前的版本不同,问题这里有解释:http://gcc.gnu.org/onlinedocs/gcc/Name-lookup.html,意思就是说:
虽然类Guard<LockType, LockingPolicy> 私有继承于 private LockHolder<LockType>,并且模板类LockHolder<LockType>中提供了isDisabled()方法。但是,由于g++ 在以后3.4以后就不能找到父类模板类中的 isDisabled()方法了,同时zthread库没有与时俱进做些修改,导致用新版本的g++编译失败。
解决方法
简而言之,3.4以后版本的g++查找名字时,对于模板类中对基类方法或者基类的成员变量的调用,如果该基类方法或者基类成员变量与模板参数类型(typename T)无关
方法一:
需要使用this-> 调用或者在类定义中声明using BaseClass<T>::function()
方法二:(参考)
先export CXXFLAGS=-fpermissive,然后再执行
./configure
make
make install
方法一对zthread 2.3.2的修改
1)include/zthread/Guard.h
494 if(!this->isDisabled())2) src/MutexImpl.h
156 this->ownerAcquired(self); 167 this->waiterArrived(self); 176 this->waiterDeparted(self); 195 this->ownerAcquired(self); 239 this->ownerAcquired(self); 256 this->waiterArrived(self); 265 this->waiterDeparted(self); 287 this->ownerAcquired(self); 329 this->ownerReleased(impl);
【yasi】make install之后,zthread的库文件位于
/usr/local/lib/libZThread.so
/usr/local/lib/libZThread.a
头文件位于
/usr/local/include/zthread