【问题标题】:C++ compatibility with library [duplicate]C ++与库的兼容性[重复]
【发布时间】:2021-08-27 23:57:37
【问题描述】:

我正在尝试从 CMake 生成一个 iOS Xcode 项目。首先,我生成了项目,它运行良好,没有任何错误。生成后,我尝试使用以下命令构建它:

cmake --build _builds --config Release --target install

那是我得到错误的时候。我在想的是,这是由于与我正在使用的库的 c++ 版本和编译器不兼容;但我不确定。这些是我从运行构建命令得到的错误:

/Users/edwardpizzurro/Desktop/watermark-lib/audiowmark/utils.hh:77:14: error: expression is not an integral
      constant expression
        case Code::NONE:
             ^~~~~~~~~~
/Users/edwardpizzurro/Desktop/watermark-lib/audiowmark/convcode.cc:42:1: error: unknown type name
      'constexpr'
constexpr  auto         ab_generators = std::array<unsigned,12>
^
/Users/edwardpizzurro/Desktop/watermark-lib/audiowmark/convcode.cc:42:25: error: illegal storage class on
      file-scoped variable
constexpr  auto         ab_generators = std::array<unsigned,12>
                        ^
/Users/edwardpizzurro/Desktop/watermark-lib/audiowmark/convcode.cc:43:3: error: expected '(' for
      function-style cast or type construction
  {
  ^
/Users/edwardpizzurro/Desktop/watermark-lib/audiowmark/convcode.cc:48:1: error: unknown type name
      'constexpr'
constexpr  unsigned int ab_rate       = ab_generators.size();
^
/Users/edwardpizzurro/Desktop/watermark-lib/audiowmark/convcode.cc:49:1: error: unknown type name
      'constexpr'
constexpr  unsigned int order         = 15;
^
/Users/edwardpizzurro/Desktop/watermark-lib/audiowmark/convcode.cc:62:1: error: unknown type name
      'constexpr'
constexpr  unsigned int state_count = (1 << order);
^
/Users/edwardpizzurro/Desktop/watermark-lib/audiowmark/convcode.cc:63:1: error: unknown type name
      'constexpr'
constexpr  unsigned int state_mask  = (1 << order) - 1;
^
/Users/edwardpizzurro/Desktop/watermark-lib/audiowmark/convcode.cc:70:12: error: expression is not an
      integral constant expression
      case ConvBlockType::a:
           ^~~~~~~~~~~~~~~~
/Users/edwardpizzurro/Desktop/watermark-lib/audiowmark/convcode.cc:71:12: error: expression is not an
      integral constant expression
      case ConvBlockType::b:  return (msg_size + order) * ab_rate / 2;
           ^~~~~~~~~~~~~~~~
/Users/edwardpizzurro/Desktop/watermark-lib/audiowmark/convcode.cc:72:12: error: expression is not an
      integral constant expression
      case ConvBlockType::ab: return (msg_size + order) * ab_rate;
           ^~~~~~~~~~~~~~~~~
/Users/edwardpizzurro/Desktop/watermark-lib/audiowmark/convcode.cc:143:27: error: a space is required
      between consecutive right angle brackets (use '> >')
  vector<vector<StateEntry>> error_count;
                          ^~
                          > >
/Users/edwardpizzurro/Desktop/watermark-lib/audiowmark/convcode.cc:143:17: warning: template argument uses
      local type 'StateEntry' [-Wlocal-type-template-args]
  vector<vector<StateEntry>> error_count;
                ^~~~~~~~~~
/Users/edwardpizzurro/Desktop/watermark-lib/audiowmark/convcode.cc:145:55: error: expected '(' for
      function-style cast or type construction
    error_count.emplace_back (state_count, StateEntry {0, -1, 0});
                                           ~~~~~~~~~~ ^
/Users/edwardpizzurro/Desktop/watermark-lib/audiowmark/convcode.cc:145:17: error: no member named
      'emplace_back' in 'std::__1::vector<std::__1::vector<StateEntry, std::__1::allocator<StateEntry> >,
      std::__1::allocator<std::__1::vector<StateEntry, std::__1::allocator<StateEntry> > > >'; did you mean
      '__emplace_back'?
    error_count.emplace_back (state_count, StateEntry {0, -1, 0});

这是我从跑步中得到的:

g++ --version

结果:

Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/4.2.1
Apple clang version 12.0.0 (clang-1200.0.32.29)
Target: x86_64-apple-darwin20.4.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin

【问题讨论】:

  • 代码至少用 C++11 编写。您是否使用该版本进行编译?
  • 我不确定如何检查我的 cmake 正在编译的版本
  • 检查版本。
  • 指定 C++ 的版本,而不是编译器

标签: c++ ios xcode cmake


【解决方案1】:

检查 g++ 的版本。

g++ --version

您的代码在 >= c++11 之上运行。

【讨论】:

  • 我用运行命令的结果更新了问题。我不确定它在对我说什么
  • OP 的问题是询问如何将编译器选项设置为 C++11,而不是如何检查正在使用的版本。作为对该问题的后续评论,这会更好。
【解决方案2】:

如果您有权访问 CMakeLists.txt 文件,请添加:

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

这可确保所有子项目也使用 C++17 构建。如果由于某种原因无法更改 CMakeLists.txt 文件,可以在配置时在命令行中传递编译器标志:

cmake -S . -B _builds -DCMAKE_CXX_FLAGS="-std=c++17"

【讨论】:

    猜你喜欢
    • 2011-06-09
    • 2012-01-24
    • 1970-01-01
    • 2014-02-10
    • 2012-01-04
    • 1970-01-01
    • 2018-06-01
    • 1970-01-01
    • 2019-04-05
    相关资源
    最近更新 更多