1

我的问题的开始是我试图在 Cocos2d-x 中使用正则表达式。无论出于何种原因,std::tr1::regex 不适用于 C++98,因此我尝试将 std::regex 与 C++11 一起使用(以及其他一些 C++11 功能)。这现在适用于 iOS,因为在 Xcode 中更改 C++ 的版本真的很容易,但我在让它在 Android 上运行时遇到了各种各样的麻烦。

我将 NDK 的 r8e 版本与 gnustl_static 库一起使用。我将LOCAL_CPPFLAGS += -std=c++11我尝试将工具链版本设置为 clang (除了默认值)。无论工具链如何,我现在都可以编译我的代码,但是当我尝试创建 std::regex 对象时它仍然崩溃std::regex reg1("[a-z][0-3]*");似乎有些人能够让 C++11 与 Android NDK 扩展库一起使用(不是“最小的 C++ 运行时支持库”),但我想不通。我已经阅读了很多想法并且我已经尝试了其中的大部分,并且我已经看到了一些线索,例如来自 NDK 文档中 CHANGES.html 的以下内容:

    Patched GCC 4.4.3/4.6/4.7 libstdc++ to work with Clang in C++11

我对这一切如何组合在一起知之甚少,所以有人能指出我正确的方向吗?我在这里想念什么?

4

3 回答 3

3

打开您的 Application.mk 文件并在末尾添加以下两行:

APP_CPPFLAGS += -std=c++11
NDK_TOOLCHAIN_VERSION=4.7

注意:正如您提到的,您使用的是 NDK 的 r8e 版本,您需要的工具链版本是 4.7。如果是r9,可以设置为4.8。

希望这可以帮助。

于 2013-10-05T21:34:05.380 回答
1

或者,如果您不限于使用 c++ 的 std::regex,您可以尝试使用标准 C: regcomp() 和 regexec() 。

这是一个示例实现(http://pubs.opengroup.org/onlinepubs/009695399/functions/regcomp.html):

#include <regex.h>

int match(const char *string, const char *pattern)
{
    int    status;
    regex_t    re;


    if (regcomp(&re, pattern, REG_EXTENDED|REG_NOSUB) != 0) {
        return(0);      /* Report error. */
    }
    status = regexec(&re, string, (size_t) 0, NULL, 0);
    regfree(&re);
    if (status != 0) {
        return(0);      /* Report error. */
    }
    return(1);
}
于 2014-07-04T10:06:10.830 回答
0

在你的 android.mk 添加

LOCAL_CPPFLAGS += -std=gnu++0x
于 2013-10-01T23:22:28.630 回答