无法在Mac OS X上构建rapidjson测试

时间:2013-01-22 03:29:00

标签: macos build compilation

我正在尝试在Mac OS X上为rapidjson 0.11(http://code.google.com/p/rapidjson/)构建测试。它包括三个项目:gtest(构建正常),unittest(构建失败)和perftest(构建失败),以及构建错误输出错误1和错误2时。

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

../../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上, SSE4_1 SSE4_2 需要为要定义的 SIDD ...常量定义预处理器常量。出于某种原因,这些 SIDD ...常量未被定义。

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

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

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

下载附件中的更正脚本

如何在OS X上成功构建它?

1 个答案:

答案 0 :(得分: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环境var 安装)
  4. 使用port select --list gcc检查已安装的gcc版本(注意:您可能不会安装某些更高版本。请参阅下一步)
  5. 使用sudo port install gcc47安装最新版本的gcc(目前为gcc47)(这需要一段时间才能下载)
  6. 再次运行port select --list gcc,您应该会在列表中看到新版本(例如mp-gcc47
  7. 选择此最新版本作为sudo port select gcc mp-gcc47
  8. 的有效gcc版本
  9. 再次运行gcc -v以检查最新版本是否有效
  10. 随着编译器的排序,第一次为release32构建rapidjson的尝试给了我关于限制头文件的错误,因为没有为32位版本定义__int128。 Gnu的官方立场是你需要自己动手。有关详细信息,请参阅以下链接中的答案:

    Compiling 32bit binary: expected unqualified-id before '__int128'

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

    仍然存在链接器警告,因为/ usr / lib64文件夹不存在,并且makefile包含标志-L/usr/lib64,但构建仍然成功。

    成功 - unittest_release_x64_gmake和perftest_release_x64_gmake都没有遇到问题!

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