【问题标题】:Error building mongodb from sources从源代码构建 mongodb 时出错
【发布时间】:2015-10-22 23:13:05
【问题描述】:

我正在尝试从源代码构建 mongodb 并遇到一些错误。

这是整个输出的粘贴箱: http://pastebin.com/pyZLTkz4

第一个错误是

endian.h does not define __BYTE_ORDER nor BYTE_ORDER. Cannot determine endianness.

所有其他错误都像

error: template with C linkage
error: template specialization with C linkage

我的配置是:

  1. Debian 8 64 位
  2. scons 版本:2.3.1
  3. python 版本:2 7 9
  4. gcc 版本:gcc (Debian 4.9.2-10) 4.9.2

安装的依赖项

sudo apt-get build-dep mongodb

我尝试在 CentOS 7 下构建它并得到相同的结果。

【问题讨论】:

  • 我在 2017 年也遇到了同样的错误,你解决了吗?

标签: c++ mongodb gcc


【解决方案1】:

在构建嵌入式 SpiderMonkey 引擎(“mozjs” - Mozilla JavaScript,版本 38)时会发生这种情况。

当您在 SCONS 中使用 VERBOSE=1 构建时,您会看到通过 -I 开关添加了一个包含目录,以使用 -Ibuild/opt/third_party/mozjs-38/extract/mfbt 进行编译。由于-I 非常激进的行为,这意味着该目录中的任何包含文件都将抢占任何同名的系统包含文件。

(关于为什么-I 会这样操作,请参阅"Why do projects use the -I include switch given the dangers?"。我将为大约 2018 年使用 SpiderMonkey 45 构建的 Google 爬虫添加,所以目录是 -Ibuild/opt/third_party/mozjs-45/extract/mfbt p>

所以发生的事情是 mfbt/Endian.h 文件(它引入了一堆高级 C++ 定义)正在覆盖系统的低级 /usr/include/endian.h 文件,当任何人试图 #include <endian.h> 到获取系统定义。

您可能遇到的问题是为什么它只发生在您身上......以及其他一些人。

我猜测原因可能与我的情况相同,这让我想到了这个问题:您的 MongoDB 源文件位于不区分大小写检索它们的文件系统上。因此,也许您正在运行 Debian Linux VM,但您的文件位于 Windows 主机上。

大多数在 Linux 上构建的人都使用完全区分大小写的文件系统,因此不会将 Endian.h 视为覆盖其系统 endian.h 的候选者。所以他们的构建成功了。


如果您运行的是自 2018 年 4 月更新以来的 Windows 10 版本,并且启用了have the Windows Subsystem for Linux,那么您可以将特定的 Windows 目录设置为区分大小写,例如

fsutil.exe 文件 SetCaseSensitiveInfo C:\Projects\mongo\src\third_party\mozjs-45\extract\mfbt enable

不幸的是,您必须对每个单独的文件夹进行设置……您不能对整个子树进行设置。 :-(

【讨论】:

    【解决方案2】:

    关于第一个错误

    sys/param.h 标头通常定义符号 __BYTE_ORDER、__BIG_ENDIAN、__LITTLE_ENDIAN 和 __PDP_ENDIAN。您可以通过执行以下操作来测试字节顺序:

    sys/param.h 标头通常定义符号 __BYTE_ORDER、__BIG_ENDIAN、__LITTLE_ENDIAN 和 __PDP_ENDIAN。您可以通过执行以下操作来测试字节顺序:

       #include <sys/param.h>
    
       #ifdef __BYTE_ORDER
       # if __BYTE_ORDER == __LITTLE_ENDIAN
       #  define I_AM_LITTLE_ENDIAN
       # else
       #  if __BYTE_ORDER == __BIG_ENDIAN
       #   define I_AM_BIG_ENDIAN
       #  else
           Error: unknown byte order!
       #  endif
       # endif
       #endif /* __BYTE_ORDER */
    

    如果 __BYTE_ORDER 未定义,您可能需要测试 BYTE_ORDER、BIG_ENDIAN 和 LITTLE_ENDIAN 是否存在。 Linux 将这些定义为带下划线的版本的同义词,显然是为了与 BSD Unix 兼容。

    如果未定义,您可以尝试以下操作:

       #if defined (i386) || defined (__i386__) || defined (_M_IX86) || \
            defined (vax) || defined (__alpha)
       # define I_AM_LITTLE_ENDIAN
       #endif
    

    Read more

    【讨论】:

      【解决方案3】:

      几个选项:

      A.您缺少 glibc 开发标头。

      尝试安装 libc6-dev (debian) 或 glibc-headers (redhat)

      B.您的包含路径上有一个非标准的 endian.h 浮动

      你可以试试跑步:

      g++ -M -Wnon-virtual-dtor -Woverloaded-virtual -std=c++11 -Wno-non-virtual-dtor -fno-omit-frame-pointer -fPIC -fno-strict-aliasing -ggdb -pthread -Wsign-compare -Wno-unknown-pragmas -Winvalid-pch -O2 -Wno-unused-local-typedefs -Wno-unused-function -Wno-deprecated-declarations -Wno-unused-but-set-variable -Wno-missing-braces -fno-builtin-memcmp -include js-confdefs.h -Wno-invalid-offsetof -DAB_CD -DIMPL_MFBT -DJS_USE_CUSTOM_ALLOCATOR -DNO_NSPR_10_SUPPORT -DSTATIC_JS_API=1 -DU_NO_DEFAULT_INCLUDE_UTF_HEADERS=1 -DPCRE_STATIC -DBOOST_THREAD_VERSION=4 -DBOOST_THREAD_DONT_PROVIDE_VARIADIC_THREAD -DBOOST_SYSTEM_NO_DEPRECATED -DBOOST_THREAD_DONT_PROVIDE_INTERRUPTIONS -DBOOST_THREAD_HAS_NO_EINTR_BUG -Isrc -Ibuild/opt -Isrc -Ibuild/opt/third_party/mozjs-38/extract/js/src -Isrc/third_party/mozjs-38/extract/js/src -Ibuild/opt/third_party/mozjs-38/extract/mfbt -Isrc/third_party/mozjs-38/extract/mfbt -Ibuild/opt/third_party/mozjs-38/extract/intl/icu/source/common -Isrc/third_party/mozjs-38/extract/intl/icu/source/common -Ibuild/opt/third_party/mozjs-38/include -Isrc/third_party/mozjs-38/include -Ibuild/opt/third_party/mozjs-38/mongo_sources -Isrc/third_party/mozjs-38/mongo_sources -Ibuild/opt/third_party/mozjs-38/platform/x86_64/linux/build -Isrc/third_party/mozjs-38/platform/x86_64/linux/build -Ibuild/opt/third_party/mozjs-38/platform/x86_64/linux/include -Isrc/third_party/mozjs-38/platform/x86_64/linux/include -Isrc/third_party/zlib-1.2.8 src/third_party/mozjs-38/extract/js/src/builtin/RegExp.cpp | grep endian.h
      

      这是从你的pastbin 中第一次编译失败,用'-M' 代替-o,这应该让我们看到你实际上包含哪个文件作为endian.h。

      【讨论】:

      • A.我已经安装了所有标题。我尝试在两个系统上构建它:Debian 和 CentOS(也许我应该尝试 Ubuntu,但我相信它会得到相同的结果)。 B. 运行这个会得到同样的错误。我有同样的错误:src/third_party/mozjs-38/extract/js/src/jscpucfg.h:71:4: error: #error "endian.h 没有定义 __BYTE_ORDER 也没有 BYTE_ORDER。无法确定字节顺序。"跨度>
      猜你喜欢
      • 2016-04-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-18
      • 1970-01-01
      相关资源
      最近更新 更多