2013-07-03 4 views
1

함께 re::engine::RE2 모듈을 설치하려고합니다."오류 : 비 POD 요소 유형의 가변 길이 배열"re :: engine :: RE2

re2_xs.cc:254:25: error: variable length array of non-POD element type 
     're2::StringPiece' 
    re2::StringPiece res[re->nparens + 1]; 
         ^

그게 무슨 뜻 이죠 :

구축 할 때, 컴파일러는 오류 메시지가 방출? 어떻게 해결할 수 있습니까? 저는 2011 Macbook Air와 Perl 5.12를 사용하고 있습니다. 오류 메시지에 대한 인터넷 검색을

+0

GCC를 설치 했습니까? –

+0

yes와 xcode too –

+0

'cpan' 또는'cpanm'을 사용하여 설치하십시오. –

답변

0

사실, re::engine::RE2은 결코 OS X에서 컴파일되지 않습니다.하지만 컴파일 할 수는 있습니다. cpan 디렉토리를 찾습니다. 나를 위해 그것은 ~/.cpan/build/re-engine-RE2-0.13-BY20k3/입니다. 그런 다음 두 개의 C++ 소스 파일을 변경합니다.

$ diff -p re2_xs.cc.old re2_xs.cc 
*** re2_xs.cc.old 2015-04-20 20:20:15.000000000 +0200 
--- re2_xs.cc 2015-04-20 20:22:24.000000000 +0200 
*************** RE2_exec(pTHX_ REGEXP * const rx, char * 
*** 229,236 **** 
     RE2 * ri = (RE2*) SvANY(rx)->pprivate; 
     regexp * re = SvANY(rx); 

-  re2::StringPiece res[re->nparens + 1]; 
- 
    #ifdef RE2_DEBUG 
     Perl_warner(aTHX_ packWARN(WARN_MISC), "RE2: Matching '%s' (%p, %p) against '%s'", stringarg, strbeg, stringarg, RX_WRAPPED(rx)); 
    #endif 
--- 229,234 ---- 
*************** RE2_exec(pTHX_ REGEXP * const rx, char * 
*** 241,246 **** 
--- 239,246 ---- 
     return 0; 
     } 

+  re2::StringPiece *res = new re2::StringPiece[re->nparens + 1]; 
+ 
     bool ok = ri->Match(
       re2::StringPiece(strbeg, strend - strbeg), 
       stringarg - strbeg, 
*************** RE2_exec(pTHX_ REGEXP * const rx, char * 
*** 250,255 **** 
--- 250,256 ---- 

     /* Matching failed */ 
     if (!ok) { 
+   delete [] res; 
      return 0; 
     } 

*************** RE2_exec(pTHX_ REGEXP * const rx, char * 
*** 266,271 **** 
--- 267,274 ---- 
      } 
     } 

+  delete [] res; 
+ 
     return 1; 
    } 

그 후 컴파일하려고 시도하면 tr1 문제가 발생합니다.

/usr/bin/clang -o obj/util/arena.o -xc++ -O3 -DHAVE_PTHREAD -pthread -Wno-sign-compare -c -I. -DNDEBUG util/arena.cc 
In file included from util/arena.cc:5: 
./util/util.h:45:10: fatal error: 'tr1/unordered_set' file not found 

나는 메이크 파일에 대한 간단한 -D 수정이 확신 해요하지만 난 코드를 변경했습니다.

# diff -p re2/util/util.h.old re2/util/util.h 
*** re2/util/util.h.old 2015-04-20 20:29:01.000000000 +0200 
--- re2/util/util.h 2015-04-20 20:29:26.000000000 +0200 
*************** using std::make_pair; 
*** 42,49 **** 

    #if defined(__GNUC__) && !defined(USE_CXX0X) 

! #include <tr1/unordered_set> 
! using std::tr1::unordered_set; 

    #else 

--- 42,51 ---- 

    #if defined(__GNUC__) && !defined(USE_CXX0X) 

! //#include <tr1/unordered_set> 
! //using std::tr1::unordered_set; 
! #include <unordered_set> 
! using std::unordered_set; 

    #else 
지금 바로

make && make install 

당신이 지금 OS X의

0

Douglas Scofield하여 대답이 올바른지 사용할 수 re::engine::RE2을 가지고 있지만 하나의 추가 변경은가 필요합니다. 다음과 같이 re2_xs.cc에서 당신은 또한 라인 (244)을 변경해야합니다

  bool ok = ri->Match(
       re2::StringPiece(strbeg, strend - strbeg), 
       stringarg - strbeg, 
       strend - strbeg, 
       RE2::UNANCHORED, 
!    res, re->nparens + 1); 

더글러스 스코필드의 대답은 포인터 배열 고해상도를 변경 * 고해상도를 가변 길이 배열의 컴파일러 오류를 방지 할 수 있습니다. 그러나,이 후 포인터의 크기를 복용하고 배열의 크기에 의해 분할 될 수 있기 때문에

sizeof res/sizeof *res 

작동하지 않는 라인을 변경합니다. 따라서 배열의 크기가 원래의 코드에 원하는 무슨이다 * 고해상도, 가리키는 얻을
re->nparens + 1 

에 변경 위로해야한다.

변경하지 않으면 캡처 그룹이 re2에서 작동하지 않습니다. $ 1, $ 2 등 캡처 그룹이 초기화되지 않은 오류가 발생합니다.

위의 훌륭한 대답은 하나의 부록을 필요로합니다.