2017-02-14 269 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