0

我正在尝试在 Mac OS X 上为 rapidjson 0.11 ( http://code.google.com/p/rapidjson/ ) 构建测试。它包括三个项目:gtest(构建良好)、unittest(构建失败)和 perftest(构建失败),并且在构建时会出现错误 1 ​​和错误 2。

编译器输出显示导致 make 失败的 unittest 和 perftest 的以下错误:

../../include/rapidjson/reader.h: In function ‘const char* rapidjson::SkipWhitespace_SIMD(const char*)’:
../../include/rapidjson/reader.h:116: error: ‘_SIDD_UBYTE_OPS’ was not declared in this scope
../../include/rapidjson/reader.h:116: error: ‘_SIDD_CMP_EQUAL_ANY’ was not declared in this scope
../../include/rapidjson/reader.h:116: error: ‘_SIDD_BIT_MASK’ was not declared in this scope
../../include/rapidjson/reader.h:116: error: ‘_SIDD_NEGATIVE_POLARITY’ was not declared in this scope

这些预处理器常量与 SSE4 指令相关。rapidjson 可以使用 SSE2 或 SSE4.2 来加速,构建时默认使用 SSE4.2。

makefile 包含 -msse4.2 编译器开关以启用 SSE4.2 支持,并且查看头文件显示在 OS X 上,需要为SIDD ... 常量定义SSE4_1SSE4_2预处理器常量。定义。出于某种原因,这些SIDD ... 常量没有被定义。

进一步的研究表明 -msse4 开关支持 SSE4.1 和 SSE4.2,所以我尝试将开关更改为 -msse4,但仍然出错。

不确定 -msse4.2 开关是否自动定义SSE4_2,但我尝试手动定义它,但还是没有运气。

注意:如果你想尝试在 Mac 上自己构建它,你需要下载一个不同的 premake 脚本文件,因为包含的文件不起作用。您可以在此处https://code.google.com/p/rapidjson/issues/detail?id=54从第二篇文章的附件中下载更正后的脚本

关于如何在 OS X 上成功构建它的任何想法?

4

1 回答 1

1

简短的回答 - 我有一个旧版本的 gcc (4.2),它不支持 -msse4.2 标志(它是在 gcc 4.3 中引入的)。

升级到最新版本的gcc后,上面的问题就消失了:

  1. 通过打开终端并运行来检查哪个版本的 gcc 处于活动状态gcc -v
  2. 从http://www.macports.org/install.php下载适用于您的 OS X 版本的 MacProst 安装程序并运行安装程序(升级 GCC 版本的简单方法)
  3. 打开新的终端窗口(必须是新的,因为 MacPorts 安装后更新了 PATH 环境变量)
  4. 检查您已经安装了哪些版本的 gcc port select --list gcc(注意:您可能不会安装一些更高版本。请参阅下一步)
  5. 安装最新版本的 gcc(目前是 gcc47)sudo port install gcc47(这需要一段时间才能下载)
  6. 再次运行port select --list gcc,您应该会在列表中看到新版本(例如。mp-gcc47
  7. 选择这个最新版本作为活动 gcc 版本sudo port select gcc mp-gcc47
  8. 再次运行gcc -v以检查最新版本是否处于活动状态

对编译器进行排序后,第一次尝试为 release32 构建 rapidjson 时,由于没有为 32 位构建定义 __int128 ,因此出现了有关限制头文件的错误。Gnu 的官方立场是你需要自己滚动。有关更多信息,请参阅以下链接中的答案:

编译 32 位二进制文​​件:在 '__int128' 之前预期的 unqualified-id

为 release64 或 debug64 构建解决了这个问题,但由于一些关于在test/unittest/readertest.cpp:187:4. 由于 make 文件包含编译器标志-Werror=cast-qual,因此这些警告被视为错误。在 unittest 和 perftest makefile 中删除这个标志解决了这个问题(不是理想的解决方案,但我只是想让它构建)。

由于 /usr/lib64 文件夹不存在,并且生成文件包含 flag ,因此仍然存在链接器警告-L/usr/lib64,但构建仍然成功。

成功 - unittest_release_x64_gmake 和 perftest_release_x64_gmake 都运行没有问题!

注意:rapidjson 构建说明包含在 ZIP 存档的自述文件中。

于 2013-01-26T02:03:45.787 回答