いくつかの単語で問題__builtin_mul_overflow clang5拡張子を認識するために失敗します。打ち鳴らす5.1で、MAC OSX 10.8.5上、コンパイラは__builtin_mul_overflow
特に、「clang5」伸長を認識していないようですunknown builtin
となります。この問題は、最新のsqlite3
(3.17)をコンパイルしようとした後に発生し、この条件付きで私に強制的に強制することを主張しています#if GCC_VERSION>=5004000 || CLANG_VERSION>=4000000
。私はCLANGテストに合格しますが、GCCテストに失敗します(バージョンについては以下を参照)。OSX 10.8.5:gccが
sqlite3.c
を修正して、これらの組み込み関数を使用しないようにすることで、この問題を回避することができました(短絡したCLANGとGCC_VERSIONのプリプロセッサ条件付きチェックがあります)。
私の質問はです:自分のシステムでclang5拡張機能を利用できないと誤解していますか?あるいは何か壊れているかもしれませんか? sqlite3.c
私のシステムでは、これらの余分な組み込み関数について知ることができるはずです.GCC-または -CLANG version-checkが成功し、コンパイラ(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
'sqlite3'は' CLANG_VERSIONで大丈夫コンパイル:8000000'、 'GCC_VERSION:あなたは'の#if GCC_VERSIONを行う際4002001' ...また何が=>起こります4002001 || CLANG_VERSION> = 5001000'? –
ありがとうございます。以前と同じように失敗します(私のバージョンからは明らかです)。私のclangのバージョン文字列、 'Apple LLVM version 5.1(clang-503.0.40)(LLVM 3.4svnに基づいています) 'は、clang5 **とclang5の拡張**を除いた何かを意味するのでしょうか? – bliako
拡張機能は基本的には、機能が現在の言語(言語拡張機能または標準言語機能のいずれか)で 'Clang 'によってサポートされているかどうかを示します。そうでない場合は' 0'、そうであれば '1'を示します。どの 'sqlite3'をソースからコンパイルしようとしていますか? –