C++ 从源代码生成mongodb时出错

C++ 从源代码生成mongodb时出错,c++,mongodb,gcc,C++,Mongodb,Gcc,我试图从源代码构建mongodb,但出现了一些错误 以下是整个输出的粘贴箱: 第一个错误是 endian.h does not define __BYTE_ORDER nor BYTE_ORDER. Cannot determine endianness. 所有其他错误都是这样的 error: template with C linkage error: template specialization with C linkage 我的配置是: Debian 8 64位 scons版本:2

我试图从源代码构建mongodb,但出现了一些错误

以下是整个输出的粘贴箱:

第一个错误是

endian.h does not define __BYTE_ORDER nor BYTE_ORDER. Cannot determine endianness.
所有其他错误都是这样的

error: template with C linkage
error: template specialization with C linkage
我的配置是:

Debian 8 64位 scons版本:2.3.1 python版本:279 gcc版本:gcc Debian 4.9.2-10 4.9.2 已安装的依赖项与

sudo apt-get build-dep mongodb
我曾尝试在CentOS 7下构建它,并获得了相同的结果。

关于第一个错误

sys/param.h头通常定义符号uuu字节顺序、uu大字节顺序、uu小字节顺序和uu小字节顺序。您可以通过执行以下操作来测试endianness:

   #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 */
sys/param.h头通常定义符号uuu字节顺序、uu大字节顺序、uu小字节顺序和uu小字节顺序。您可以通过执行以下操作来测试endianness:

   #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 */
有两种选择:

答:您缺少glibc开发标题

尝试安装libc6 dev debian或glibc headers redhat

B.在include路径上有一个非标准的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

这是在构建嵌入式SpiderMonkey引擎mozjs-Mozilla JavaScript版本38时发生的

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

为什么-我这样做,看。我将为构建于2018年左右的谷歌爬虫添加SpiderMonkey 45,因此目录为-Ibuild/opt/third_party/mozjs-45/extract/mfbt

这样,发生了一堆高级C++定义的MFTB/Endia.h文件覆盖了系统的低级/Ur/Eng/Endidi.h文件,当任何人试图包含以获得系统定义时,它都会造成严重破坏。 你可能会问,为什么它只发生在你身上……和其他一些人身上

我猜原因可能与我的案例相同,这让我想到了这个问题:您的MongoDB源文件位于一个文件系统上,该文件系统正在不敏感地检索它们。因此,也许您运行的是Debian Linux虚拟机,但您的文件位于Windows主机上

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

如果您正在运行自2018年4月更新以来的Windows 10版本,并且已启用,则可以将特定的Windows目录设置为区分大小写,例如

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


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

我已经安装了所有的标题。我尝试在这两个系统上构建它:Debian和CentOS可能是我应该尝试Ubuntu,但我相信它会有相同的结果。运行这个程序会给我带来同样的错误。我有相同的错误:src/third_party/mozjs-38/extract/js/src/jscpucfg.h:71:4:error:error-endian.h不定义字节顺序或字节顺序。无法确定endianness。我在2017年遇到了同样的错误,你解决过吗?