caffe_ssd 우연히 컴파일 버그 설명 및 해결 기록

3013 단어 caffe
weiliu 대신의 ssd 프레임워크는 사용하기 좋은데 서버를 다시 설치한 후에 ssd 컴파일에 이상한 버그가 발생했습니다.
CXX src/caffe/data_transformer.cpp
In file included from src/caffe/data_transformer.cpp:8:0:
./include/caffe/data_transformer.hpp:69:24: error: ‘AnnotatedDatum’ does not name a type
   void Transform(const AnnotatedDatum& anno_datum,
                        ^
./include/caffe/data_transformer.hpp:71:35: error: ‘AnnotationGroup’ was not declared in this scope
                  RepeatedPtrField* transformed_anno_vec);
                                   ^
./include/caffe/data_transformer.hpp:71:50: error: template argument 1 is invalid
                  RepeatedPtrField* transformed_anno_vec);
                                                  ^
./include/caffe/data_transformer.hpp:72:24: error: ‘AnnotatedDatum’ does not name a type
   void Transform(const AnnotatedDatum& anno_datum,
                        ^
......



한 걸음 한 걸음
error:'AnnotatedDatum'does not name a type 설명에 정의를 찾지 못했습니다. "/include/caffe/data_transformer.hpp:69:24:"
void Transform(const AnnotatedDatum& anno_datum,
                 Blob* transformed_blob,
                 RepeatedPtrField* transformed_anno_vec);

결론 마찬가지: 정의가 없다.
grep, AnnotatedDatum의 정의가 어디에 있는지 봅시다. 곧 찾을 수 있습니다.
“caffe/proto/caffe.pb.h”

그래서 이 카페를 보세요.pb.h어떻게 왔길래make의 첫걸음
PROTOC src/caffe/proto/caffe.proto
의 산물, 사실,caffe.proto--→caffe.pb.이 과정은 성공적,caffe.pb.h도 경로에 포함됩니다.
 
그럼 질문이 왔습니다.
CXX src/caffe/data_transformer.cpp에서 헤더 파일caffe를 찾았습니다.pb.그리고 카페.pb.h도 AnnotatedDatum에 정의를 주었는데 왜 컴파일할 때 AnnotatedDatum에 정의가 없습니다(caffe.pb.h를 찾지 못하는 것이 아니라)????
 
 
일련의 고통스러운 debug를 거친 이유는 Makefile의 한마디에 있다.
COMMON_FLAGS += $(foreach includedir,$(INCLUDE_DIRS),-isystem $(includedir))
 
파란색 글자 부분을 주의하고,
- isystem은 gcc의 매개 변수로 인용 경로를 표시하지만
If a standard system include directory, or a directory specified with-isystem, is also specified with-I, the -Ioption is ignored. The directory is still searched but as asystem directory at its normal position in the system include chain. This is to ensure that GCC's procedure to fix buggy system headers andthe ordering for the include_next  directive are not inadvertently changed. If you really need to change the search order for system directories,use the-nostdinc and/or -isystem
 options. 
대의는 - isystem에서 - I 안의 헤더 파일과 충돌하면 무시합니다 - I!!!!!!!
 
즉, 시스템 (예를 들어/usr/local/include) 등에 같은 이름의 파일이 있으면 로컬 (예를 들어/홈/XXX/caffe/include) 헤더 파일 검색을 하지 않습니다.
공교롭게도 제가 전에 카페를 설치했을 때 또 한 번 cmake를 사용했습니다. 손으로 make install을 썼습니다...그래서 내 시스템에는 확실히 기초caffe 환경이 있는데 ssd와 다르다...
이로써
 
알파벳을 몇 개 바꿨어요:-isystem----->-I
문제 해결.
 
그런데 이 알파벳 몇 개가 이틀이나 걸렸어요. 다 그런 건 아니지만 생각만 해도 가슴이 아파요.

좋은 웹페이지 즐겨찾기