我正在尝试使用cpan
安装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 :(得分:0)
re::engine::RE2 was never successfully tested on darwin/Perl 5.12.
谷歌搜索错误消息表明这是旧版铿锵声中的一个缺陷,它与Xcode一起提供,并且不存在于较新版本中。
升级您的软件you're out of support,或许可以使用Macports获取新的gcc。
答案 1 :(得分: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
我确信Makefile有更简单的-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提供re::engine::RE2
。
答案 2 :(得分:0)
Douglas Scofield的答案是正确的,但需要另外一项更改。在re2_xs.cc中,您还必须按如下方式更改第244行:
bool ok = ri->Match(
re2::StringPiece(strbeg, strend - strbeg),
stringarg - strbeg,
strend - strbeg,
RE2::UNANCHORED,
! res, re->nparens + 1);
Douglas Scofield的答案将数组res更改为指针* res,以避免可变长度数组的编译器错误。但是,在此之后更改了行
sizeof res / sizeof *res
不起作用,因为您将获取指针的大小并除以数组的大小。因此,您必须进行上述更改
re->nparens + 1
获取* res指向的数组大小,这是原始代码中所需的。
如果您不进行更改,则捕获组将无法在re2中运行。您将收到错误,您的捕获组(如$ 1,$ 2等)未初始化。
上面的答案非常好,只需要一个附录。