从源代码构建mongodb时出错

时间:2015-07-31 09:56:45

标签: c++ mongodb gcc

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

这是整个输出的pastebin: 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
  5. 使用

    安装的依赖项
    sudo apt-get build-dep mongodb
    

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

3 个答案:

答案 0 :(得分: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年构建的Google搜寻器添加使用SpiderMonkey 45的内容,因此目录为-Ibuild/opt/third_party/mozjs-45/extract/mfbt

因此,正在发生的事情是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

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

答案 1 :(得分:0)

关于第一个错误

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

答案 2 :(得分:0)

有两种选择:

一个。你错过了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第一次编译失败的&#39; -M&#39;替换-o,这应该让我们看看你实际包含哪个文件作为endian.h。