2017-02-14 28 views
1

几个字问题:在MAC OSX 10.8.5,与铛5.1,编译器似乎没有认识“clang5”的扩展,特别是__builtin_mul_overflow出现为unknown builtin。在试图编译最新的sqlite3(3.17)后,问题就出现了,它坚持要通过这个条件#if GCC_VERSION>=5004000 || CLANG_VERSION>=4000000强迫他们进入我。我通过了CLANG测试但未通过GCC测试(请参阅下面的版本)。OSX 10.8.5:GCC未能识别clang5延伸__builtin_mul_overflow

我已经设法绕过这个问题,修改sqlite3.c不使用这些内置函数(对于CLANG和GCC_VERSION我有一个预处理条件检查)。

我的问题是:我误认为clang5扩展可用于我的系统?或者可能会被破坏? sqlite3.c认为我的系统应该能够知道这些额外的内置函数,GCC- -CLANG版本检查成功,然后编译器(gcc)失败,出现unknown builtin错误。

全部细节

$ clang --version 
Apple LLVM version 5.1 (clang-503.0.40) (based on LLVM 3.4svn) 
Target: x86_64-apple-darwin12.6.0 
Thread model: posix 

$ gcc --version 
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1 
Apple LLVM version 5.1 (clang-503.0.40) (based on LLVM 3.4svn) 
Target: x86_64-apple-darwin12.6.0 
Thread model: posix 

下面的程序:

 # define GCC_VERSION (__GNUC__*1000000+__GNUC_MINOR__*1000+__GNUC_PATCHLEVEL__) 
# define CLANG_VERSION (__clang_major__*1000000+__clang_minor__*1000+__clang_patchlevel__) 

    #include <stdio.h> 

    int main(void){ 
      printf("CLANG_VERSION: %d\n", CLANG_VERSION); 
      printf("GCC_VERSION: %d\n", GCC_VERSION); 
    } 

(从sqlite3的借用)给出的输出:

CLANG_VERSION: 5001000 
GCC_VERSION: 4002001 

和sqlite3.c决定使用__builtin_mul_overflow使用这段代码(li ne 28856等):

#if GCC_VERSION>=5004000 || CLANG_VERSION>=4000000 
    return __builtin_mul_overflow(*pA, iB, pA); 
#else 
    ... code without the builtin which succeeds if check is short-circuited ... 
#endif 
+0

'sqlite3'编译还好用'CLANG_VERSION:8000000','GCC_VERSION:4002001' ......当你'而且会发生什么#如果GCC_VERSION> = 4002001 || CLANG_VERSION> = 5001000'? –

+0

谢谢。它像以前一样失败(从我的版本中很明显)。你知道我的clang版本字符串是否可能:'Apple LLVM version 5.1(clang-503.0.40)(基于LLVM 3.4svn)'是指除clang5 **之外的其他clang5扩展**吗? – bliako

+0

扩展基本上用于指示当前语言(作为语言扩展或标准语言功能)是否支持'Clang'或者否则为'0',如果是,则为'1'。你试图从源代码编译哪个'sqlite3'? –

回答

0

这显然是一个错误。总之,把谁的CLANG_VERSION>=4000000检查中sqlite3.c没有意识到的Clang苹果版本你有(5.1)不支持内建函数:

__builtin_add_overflow(*pA, iB, pA); 
__builtin_sub_overflow(*pA, iB, pA); 
__builtin_mul_overflow(*pA, iB, pA); 

显然不行,但是编译器的推移认为它是这样做的,那是当你得到错误。您可以删除这些支票,并在每种#else之后留下代码,或者将CLANG_VERSION>=修改为支持这些功能的任何版本;无论哪种方式,它应该在编译时使用正确的代码。

Modified Code(更换线28834-28889在sqlite3.c

+0

“没有意识到你拥有的Clang苹果版本(5.1)不支持内置函数”:你确定吗? OSX 10.8.5中的铿锵5.1实际上是否意味着其他版本(有时发生在这些苹果OS上)不支持这些扩展的铿锵声? – bliako

+0

是的,MacOS上的Clang/LLVM与Linux上的Clang不同。这是苹果自己的修改版本,并且正在实施的一些功能有可能略微落后于Linux的对手。 –

+0

我已经发布了一个错误报告给sqlite3论坛,并会等待他们的回答。 – bliako