我正在尝试在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上成功构建它?
答案 0 :(得分:1)
简短回答 - 我有一个较旧版本的gcc(4.2),它不支持-msse4.2标志(它是在gcc 4.3中引入的)。
升级到最新版本的gcc后,上述问题消失了:
gcc -v
port select --list gcc
检查已安装的gcc版本(注意:您可能不会安装某些更高版本。请参阅下一步)sudo port install gcc47
安装最新版本的gcc(目前为gcc47)(这需要一段时间才能下载)port select --list gcc
,您应该会在列表中看到新版本(例如mp-gcc47
)sudo port select gcc mp-gcc47
gcc -v
以检查最新版本是否有效随着编译器的排序,第一次为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存档的自述文件中。