【问题标题】:Compile hadoop native libraries in Mac OS Catalina. error: unknown type name 'constexpr'. alias declarations are a C++11 extension在 Mac OS Catalina 中编译 hadoop 原生库。错误:未知类型名称“constexpr”。别名声明是 C++11 扩展
【发布时间】:2020-11-10 11:16:02
【问题描述】:

我正在尝试在 Unix 中编译 Hadoop 本地库,这就是我正在使用的:

  1. Hadoop:分支 3.2 (here is the Hadoop Repository)
  2. macOS:Catalina 版本 10.15.5
  3. Protobuf:libprotoc 2.5.0
  4. OpenSSL 1.0.2t 2019 年 9 月 10 日
  5. gcc:Apple clang 版本 11.0.3 (clang-1103.0.32.62) 目标:x86_64-apple-darwin19.5.0 线程模型:posix InstalledDir:/Library/Developer/CommandLineTools/usr/bin
  6. java 版本“1.8.0_251”(内部版本 1.8.0_251-b08)

我按照这里的所有步骤操作:Compiling Hadoop on MAC 在修复了 openssl 和 protobuf 的几个问题后,现在看起来 Apache Hadoop MapReduce NativeTask 的编译由于与 C++11 的依赖关系而失败。

我是否需要以某种方式指定将 CXXFLAGS 参数设置为 -std=c++11?我该怎么做?还是我的 gcc 中缺少一些配置?

我尝试为 gcc 设置一个别名,然后立即使用标志调用它,就像这里解释的那样:How to make clang support C++ 11 by default,但仍然不起作用。

到目前为止,这些是我遇到的许多类似错误之一:

[WARNING] /usr/local/include/snappy-stubs-public.h:61:16: warning: alias declarations are a C++11 extension [-Wc++11-extensions]

[WARNING] using uint64 = std::uint64_t;

[WARNING] In file included from /Users/josh/Dev/hadoop/repo/hadoop/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-nativetask/src/main/native/test/TestCompressions.cc:29:

[WARNING] /usr/local/include/snappy.h:197:10: error: unknown type name 'constexpr'

[WARNING]   static constexpr int kBlockLog = 16;

[INFO] Apache Hadoop MapReduce NativeTask ................. FAILURE [  1.995 s]

在仔细阅读输出后,我认为这是最终引发错误的命令:

[WARNING] /Library/Developer/CommandLineTools/usr/bin/make  -f CMakeFiles/nttest.dir/build.make CMakeFiles/nttest.dir/build
[WARNING] [ 75%] Building CXX object CMakeFiles/nttest.dir/main/native/test/TestCompressions.cc.o
[WARNING] /Library/Developer/CommandLineTools/usr/bin/c++   -I/Users/josh/Dev/hadoop/repo/hadoop/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-nativetask/target/native/javah -I/Users/josh/Dev/hadoop/repo/hadoop/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-nativetask/src/main/native/src -I/Users/josh/Dev/hadoop/repo/hadoop/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-nativetask/src/main/native/src/util -I/Users/josh/Dev/hadoop/repo/hadoop/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-nativetask/src/main/native/src/lib -I/Users/josh/Dev/hadoop/repo/hadoop/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-nativetask/src/main/native/test -I/Users/josh/Dev/hadoop/repo/hadoop/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-nativetask/src -I/Users/josh/Dev/hadoop/repo/hadoop/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-nativetask/target/native -I/Library/Java/JavaVirtualMachines/jdk1.8.0_251.jdk/Contents/Home/include -I/Library/Java/JavaVirtualMachines/jdk1.8.0_251.jdk/Contents/Home/include/darwin -I/usr/local/include -isystem /Users/josh/Dev/hadoop/repo/hadoop/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-nativetask/src/../../../../hadoop-common-project/hadoop-common/src/main/native/gtest/include  -g -O2 -Wall -pthread -D_FILE_OFFSET_BITS=64 -DNDEBUG -DSIMPLE_MEMCPY -fno-strict-aliasing -fsigned-char -isysroot /Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk   -o CMakeFiles/nttest.dir/main/native/test/TestCompressions.cc.o -c /Users/josh/Dev/hadoop/repo/hadoop/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-nativetask/src/main/native/test/TestCompressions.cc
[WARNING] In file included from /Users/josh/Dev/hadoop/repo/hadoop/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-nativetask/src/main/native/test/TestCompressions.cc:29:
[WARNING] In file included from /usr/local/include/snappy.h:45:
[WARNING] /usr/local/include/snappy-stubs-public.h:54:14: warning: alias declarations are a C++11 extension [-Wc++11-extensions]
[WARNING] using int8 = std::int8_t;

谢谢!

【问题讨论】:

    标签: c++ macos c++11 unix hadoop


    【解决方案1】:

    我也很难在 OSX 上使用 clang 构建 hadoop-native 库。改用gcc 10 时我取得了更大的成功。

    首先使用自制软件安装:

    brew install gcc
    

    这应该将gcc 二进制文件放在路径中,但它们将是gcc-10g++-10 等。所以设置一些环境魔法应该让CMake 使用这些而不是内置的clang 二进制文件:

    export CC=$(which gcc-10)
    export CXX=$(which g++-10)
    export CPP=$(which cpp-10)
    export LD=$(which gcc-10)
    

    【讨论】:

    • 嘿@growse!非常感谢您的回答!我添加了这些变量,它们看起来像这样: echo $CC /usr/local/bin/gcc-10, $ echo $CXX /usr/local/bin/g++-10, $ echo $CPP /usr/local/bin/ cpp-10, $ echo $LD /usr/local/bin/gcc-10.所以可能使用了这些二进制文件,但我应该以某种方式安装 11 版吗?由于错误仍然是相同的。它说它们是 C++11 扩展 :(
    • 我在错误之前也看到了这个,这让我认为 CXX env 变量被忽略了:[WARNING] [ 75%] Building CXX object CMakeFiles/nttest.dir/main/native/test/ TestCompressions.cc.o [警告] /Library/Developer/CommandLineTools/usr/bin/c++。有没有办法添加 -std=c++11 标志来编译hadoop?
    • 在使用新环境变量进行重建之前,您是否执行过mvn cleangit clean?我担心 CMake 会将您以前的环境“烘焙”到它生成的 makefile 中。
    • 遗憾的是,清理后我遇到了更多问题。刚刚在官方 hadoop 文档(最近更新)中发现:“本机 hadoop 库仅在 *nix 平台上受支持。该库不适用于 Cygwin 或 Mac OS X 平台。”。我想我们会被卡住,直到支持它。 Native Libraries Guide
    猜你喜欢
    • 2017-12-16
    • 1970-01-01
    • 1970-01-01
    • 2014-04-17
    • 1970-01-01
    • 2013-01-18
    • 2017-04-04
    • 1970-01-01
    • 2017-03-23
    相关资源
    最近更新 更多