zthread 라 이브 러 리 (version 2.3.2) 가 gcc 3.4.2 에서 문 제 를 컴 파일 하 는 해결 방법

다음으로 이동:
http://blog.sina.com.cn/s/blog_591f0e6e010008o7.html
http://www.cnblogs.com/moodlxs/archive/2012/10/16/2725329.html
zthread 라 이브 러 리 안내
ZThread 라 이브 러 리 는 POSIX 와 Win 32 시스템 의 C + + 프로그램 을 실행 하기 위해 개 원 된 크로스 플랫폼 고급 대상 지향 스 레 드 와 synchronization 라 이브 러 리 입 니 다.
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, Locking Policy > 는 private LockHolder < LockType >, private NonCopyable 에 개인 적 으로 계승 되 었 습 니 다. 템 플 릿 류 LockHolder < LockType > 에 서 는 isDisabled () 방법 을 제 공 했 는데 왜 컴 파일 러 가 인식 되 지 않 습 니까? (GNU gcc / g + 버 전의 문제?)
이것 은 컴 파일 러 컴 파일 러 버 전의 문제 입 니 다. Zthread 의 작 가 는 개발 을 중단 한 지 오래 되 었 습 니 다.
g + + 3.4 이후 버 전의 이름 찾기 방법 은 이전 버 전과 다 릅 니 다. 문 제 는 다음 과 같 습 니 다.http://gcc.gnu.org/onlinedocs/gcc/Name-lookup.html그 러 니까
클래스 Guard < LockType, Locking Policy > 는 private LockHolder < LockType > 에 개인 적 으로 계승 되 고 템 플 릿 류 LockHolder < LockType > 에 isDisabled () 방법 을 제공 합 니 다. 그러나 g + + 는 이후 3.4 이후 부모 템 플 릿 류 의 isDisabled () 방법 을 찾 을 수 없 으 며, zthread 라 이브 러 리 는 시간 과 함께 수정 되 지 않 아 새로운 버 전의 g + + 컴 파일 에 실 패 했 습 니 다.
해결 방법
요컨대 3.4 이후 버 전의 g + + 에서 이름 을 찾 을 때 템 플 릿 클래스 에서 기본 클래스 방법 이나 기본 클래스 의 구성원 변 수 를 호출 합 니 다. 이 기본 클래스 방법 이나 기본 클래스 의 구성원 변 수 는 템 플 릿 매개 변수 형식 (type: name T) 과 무관 합 니 다.
방법 1:
this - > 호출 또는 클래스 정의 에서 using BaseClass < T >: function () 을 사용 해 야 합 니 다.
방법 2: (참고)
먼저 export CXXFLAGS = - permissive 를 한 다음 에 실행 합 니 다.
./configure
make
make install
방법 1 대 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

좋은 웹페이지 즐겨찾기