【问题标题】:Clang doesnt recognize std::all_of in <algorithm>Clang 无法识别 <algorithm> 中的 std::all_of
【发布时间】:2014-09-06 00:27:26
【问题描述】:

在我们的测试环境中编译时遇到以下问题:

尽管 Windows 已经可以工作,但我们在 Freebsd 9 上的构建失败并显示以下错误消息:

error: no member named 'all_of' in namespace 'std'

鉴于我将 -std=c++11 添加到我们的 Cmake 标志中,我想知道为什么这不起作用。

clang version 3.4 (tags/RELEASE_34/final)
Target: i386-portbld-freebsd9.1
Thread model: posix

功能如下

#include <algorithm>
...
inline bool is_positive_number(const std::string & str)
{
    if (str.empty())
            return false;

    return std::all_of(str.begin(), str.end(), ::isdigit);
}

来自 pkg install clang34 的安装程序日志

Installing libexecinfo: 1.1_3
Installing llvm34: 3.4_1
Installing clang34: 3.4_2

感谢帮助,我认为这个功能是几年前实现的,但显然我用错了,或者我完全误解了一些东西,这两种方法都可能是我对 clang 很陌生。

编辑:过程的详细信息。

Selected GCC installation:
 "/usr/local/llvm34/bin/clang" -cc1 -triple i386-portbld-freebsd9.1 -emit-obj -mrelax-all -disable-free -disable-llvm-verifier -main-file-name main.cpp -mrelocation-model static -mdisable-fp-elim -masm-verbose -mconstructor-aliases -target-cpu i486 -target-linker-version 2.17.50 -v -v -g -coverage-file /home/source/release/server/game/CMakeFiles/game_r4708M_32.dir/src/main.cpp.o -resource-dir /usr/local/llvm34/bin/../lib/clang/3.4 -D "__SVN_VERSION__=\"\"" -I /home/source/release/server/game/../../extern/include/boost -I /home/source/release/server/game/../../extern/include -I /home/source/release/server/game/../libmysql/mysql-connector-c-6.1.5-src/output/freebsd/include -I /home/source/release/server/game/../liblua/include -I /home/source/release/server/game/../libdevil -internal-isystem /usr/include/c++/4.2 -internal-isystem /usr/include/c++/4.2/backward -Wno-invalid-source-encoding -W -Wno-invalid-source-encoding -W -std=c++11 -fdeprecated-macro -fdebug-compilation-dir /home/source/release/server/game -ferror-limit 19 -fmessage-length 237 -mstackrealign -fobjc-runtime=gnustep -fcxx-exceptions -fexceptions -fdiagnostics-show-option -fcolor-diagnostics -vectorize-slp -o CMakeFiles/game_r4708M_32.dir/src/main.cpp.o -x c++ /home/source/release/server/game/src/main.cpp
clang -cc1 version 3.4 based upon LLVM 3.4 default target i386-portbld-freebsd9.1
ignoring duplicate directory "/usr/include/c++/4.2"
ignoring duplicate directory "/usr/include/c++/4.2"
ignoring duplicate directory "/usr/include/c++/4.2/backward"
#include "..." search starts here:
#include <...> search starts here:
 /home/source/release/server/game/../../extern/include/boost
 /home/source/release/server/game/../../extern/include
 /home/source/release/server/game/../libmysql/mysql-connector-c-6.1.5-src/output/freebsd/include
 /home/source/release/server/game/../liblua/include
 /home/source/release/server/game/../libdevil
 /usr/include/c++/4.2
 /usr/include/c++/4.2/backward
 /usr/local/llvm34/bin/../lib/clang/3.4/include

按照 Steve Wills 的建议切换到“-stdlib=libc++”后,我认为它选择了正确的包含路径 (v1),但仍未找到或冲突。

 clang version 3.4 (tags/RELEASE_34/final)
Target: i386-portbld-freebsd9.1
Thread model: posix
Selected GCC installation:
 "/usr/local/llvm34/bin/clang" -cc1 -triple i386-portbld-freebsd9.1 -emit-obj -mrelax-all -disable-free -disable-llvm-verifier -main-file-name main.cpp -mrelocation-model static -mdisable-fp-elim -masm-verbose -mconstructor-aliases -target-cpu i486 -target-linker-version 2.17.50 -v -v -g -coverage-file /home/source/release/server/game/CMakeFiles/game_r4708M_32.dir/src/main.cpp.o -resource-dir /usr/local/llvm34/bin/../lib/clang/3.4 -D "__SVN_VERSION__=\"\"" -I /home/source/release/server/game/../../extern/include/boost -I /home/source/release/server/game/../../extern/include -I /home/source/release/server/game/../libmysql/mysql-connector-c-6.1.5-src/output/freebsd/include -I /home/source/release/server/game/../liblua/include -I /home/source/release/server/game/../libdevil -internal-isystem /usr/include/c++/v1 -Wno-invalid-source-encoding -W -Wno-invalid-source-encoding -W -std=c++11 -fdeprecated-macro -fdebug-compilation-dir /home/source/release/server/game -ferror-limit 19 -fmessage-length 237 -mstackrealign -fobjc-runtime=gnustep -fcxx-exceptions -fexceptions -fdiagnostics-show-option -fcolor-diagnostics -vectorize-slp -o CMakeFiles/game_r4708M_32.dir/src/main.cpp.o -x c++ /home/source/release/server/game/src/main.cpp
clang -cc1 version 3.4 based upon LLVM 3.4 default target i386-portbld-freebsd9.1
ignoring duplicate directory "/usr/include/c++/4.2"
#include "..." search starts here:
#include <...> search starts here:
 /home/source/release/server/game/../../extern/include/boost
 /home/source/release/server/game/../../extern/include
 /home/source/release/server/game/../libmysql/mysql-connector-c-6.1.5-src/output/freebsd/include
 /home/source/release/server/game/../liblua/include
 /home/source/release/server/game/../libdevil
 /usr/include/c++/v1
 /usr/include/c++/4.2
 /usr/include/c++/4.2/backward
 /usr/local/llvm34/bin/../lib/clang/3.4/include
 /usr/include
End of search list.
In file included from /home/source/release/server/game/src/main.cpp:1:
In file included from /home/source/release/server/game/src/stdafx.h:12:
/home/source/release/server/game/src/../../common/utils.h:120:14: error: no member named 'all_of' in namespace 'std'

【问题讨论】:

  • clang 的标准库和 GCC 的标准库之间可能有一些混合?
  • 这确实可能是真的,但我如何检查这种行为?
  • 预处理并检查结果。 gcc 头文件有时会在路径中安装 gcc 版本号。
  • 好吧,我包含了一些信息,但我仍然无法从中得到什么。感谢您到目前为止的帮助:)
  • 添加“-stdlib=libc++”有帮助吗?

标签: c++ c++11 clang freebsd


【解决方案1】:

要运行 all_of 函数,您需要 c++11 编译器 如果您在代码块中运行程序,然后转到 setting --&gt; compliers --&gt; c++11 ISO c++ language standard [-std=c++11] 它肯定会奏效 谢谢祝你好运

【讨论】:

    【解决方案2】:

    此错误可能是由于缺少:

    set( CMAKE_CXX_STANDARD 11 )
    

    【讨论】:

      【解决方案3】:

      您的 Cmake 设置中似乎有些内容。 或者可能是 Cmake 不太擅长识别 Clang?

      以下最小示例;

      #include <algorithm>
      #include <string>
      
      bool is_positive_number(const std::string & str);
      
      int main(int argc, char *argv[]) {
          is_positive_number("12");
      }
      
      bool is_positive_number(const std::string & str)
      {
          if (str.empty())
                  return false;
      
          return std::all_of(str.begin(), str.end(), ::isdigit);
      }
      

      使用c++clang++ 编译时没有任何警告;

      c++ -Wall foo.cpp
      

      供参考(为方便起见重新格式化):

      c++ -### foo.cpp
      FreeBSD clang version 3.4 (tags/RELEASE_34/final 197956) 20140216
      Target: x86_64-unknown-freebsd10.0
      Thread model: posix
       "/usr/bin/c++" "-cc1" "-triple" "x86_64-unknown-freebsd10.0" 
      "-emit-obj" "-mrelax-all" "-disable-free" "-disable-llvm-verifier" 
      "-main-file-name" "foo.cpp" "-mrelocation-model" "static" 
      "-mdisable-fp-elim" 
      "-masm-verbose" "-mconstructor-aliases" "-munwind-tables" 
      "-target-cpu" "x86-64" "-resource-dir" "/usr/bin/../lib/clang/3.4" 
      "-internal-isystem" "/usr/include/c++/v1" "-fdeprecated-macro" 
      "-fdebug-compilation-dir" "/home/rsmith/tmp" "-ferror-limit" "19" 
      "-fmessage-length" "105" "-mstackrealign" "-fobjc-runtime=gnustep" 
      "-fcxx-exceptions" "-fexceptions" "-fdiagnostics-show-option" 
      "-fcolor-diagnostics" "-vectorize-slp" "-o" "/tmp/foo-206692.o" 
      "-x" "c++" "foo.cpp"
      "/usr/bin/ld" "--eh-frame-hdr" "-dynamic-linker" 
      "/libexec /ld-elf.so.1" "--hash-style=both" "--enable-new-dtags"
      "-o" "a.out" "/usr/lib/crt1.o" "/usr/lib/crti.o" 
      "/usr/lib/crtbegin.o" "-L/usr/lib" "/tmp/foo-206692.o" 
      "-lc++" "-lm" "-lgcc" "--as-needed" "-lgcc_s" "--no-as-needed"
      "-lc" "-lgcc" "--as-needed" "-lgcc_s" "--no-as-needed" 
      "/usr/lib/crtend.o" "/usr/lib/crtn.o"
      

      注意这仅使用"-internal-isystem" "/usr/include/c++/v1",而您的调用也使用/usr/include/c++/4.2"(来自旧的 GCC c++ 版本 4.2)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-01-27
        • 2015-11-25
        • 2021-07-31
        • 2019-08-22
        • 2017-08-15
        • 2017-07-17
        • 2023-04-08
        • 1970-01-01
        相关资源
        最近更新 更多