从源代码构建mongodb时出现错误

4
我正在尝试从源代码构建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

使用以下命令安装了依赖项

sudo apt-get build-dep mongodb

我尝试在CentOS 7下构建它,结果相同。

1
我在2017年也遇到了同样的错误,你解决了吗? - grivescorbett
3个回答

1

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

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

(有关-I表现出这种方式的原因,请参见"为什么项目在存在危险的情况下使用-I包含开关?"。我要补充一下,对于Google爬虫来说,大约在2018年左右的构建中使用的是SpiderMonkey 45,因此该目录为-Ibuild/opt/third_party/mozjs-45/extract/mfbt

发生的情况是mfbt/Endian.h文件(引入了许多高级C++定义)覆盖了您系统的低级/usr/include/endian.h文件,这会在任何人尝试使用#include <endian.h>获取系统定义时造成混乱。
你可能会问为什么只有你和其他几个人会出现这种情况...
我猜原因可能与我的情况相同,导致我提出这个问题:您的MongoDB源文件位于一个不区分大小写的文件系统上。所以也许你正在运行Debian Linux虚拟机,但是你的文件在Windows主机上。
大多数在Linux上构建的人都使用完全区分大小写的文件系统,这样就不会将Endian.h视为覆盖其系统的endian.h的候选项。因此,他们的构建成功了。
如果您正在运行自2018年4月更新以来的Windows 10版本,并启用了Windows子系统Linux,则可以将特定的Windows目录设置为区分大小写,例如:

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

不幸的是,这是您必须在每个单独的文件夹上设置的...您不能为整个子树执行此操作。 :-(

0

有几个选项:

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 does not define __BYTE_ORDER nor BYTE_ORDER. Cannot determine endianness." - Konstantin Bodnia

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

阅读更多


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接