【问题标题】:How to know if libstdc++ support std::regex如何知道 libstdc++ 是否支持 std::regex
【发布时间】:2015-10-31 01:53:27
【问题描述】:

我有一个使用 std::regex 的应用程序,它在我的计算机上构建并运行良好。但是,在 ubuntu 14.04 上,它可以构建但不起作用,因为 std::regex 没有在那个旧的 libstdc++ 上实现。

我想在我的代码中#ifdef 一些行来解决这个问题,但似乎可以找到一种可靠的方法来确定 libstdc++ 是否支持它。

我正在使用 cmake,所以如果我能够获得库的版本(/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.19 -> 6019),我也会很高兴。

【问题讨论】:

    标签: c++ gcc cmake libstdc++


    【解决方案1】:

    您可以编写一个简单的测试来检查它是否有效。首先是 CMake 部分:

    include(CMakePushCheckState)
    include(CheckCXXSourceRuns)
    cmake_push_check_state()
    set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -std=c++11")
    check_cxx_source_runs("
          #include <regex>
    
          int main() {
            return std::regex_match(\"StackOverflow\", std::regex(\"(stack)(.*)\"));
          }
    " HAVE_CXX_11_REGEX)
    cmake_pop_check_state()
    

    然后您必须将变量 HAVE_CXX_11_REGEX 包含到您的 config.h 中。然后您可以使用#ifdef HAVE_CXX_11_REGEX 进行测试。

    【讨论】:

    • 谢谢,我搞定了cmake的TRY_RUN,类似
    • 这几乎可以工作,但会在未处理的std::regex_error 上中止,g++-4.8 编译的程序会抛出该错误(由于 GCC 4.8 中 std::regex 的实现不可用)。在某些情况下,这是可以的,但如果用户将核心转储保存在某处,则不是很好。这个脚本会在那个位置乱扔垃圾。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-02-20
    • 2015-08-15
    • 2015-04-07
    • 2020-07-03
    • 1970-01-01
    • 1970-01-01
    • 2018-01-16
    相关资源
    最近更新 更多