몇 마디의 문제 __builtin_mul_overflow clang5 확장을 인식하지 못합니다 : 그 소리 5.1과 더불어, MAC OSX 10.8.5에, 컴파일러는 __builtin_mul_overflow
특히, 'clang5'확장을 인식하지 않는 것 unknown builtin
으로 나옵니다. 문제는이 조건부 #if GCC_VERSION>=5004000 || CLANG_VERSION>=4000000
을 통해 나를 강제로 밀어 붙이는 최신 sqlite3
(3.17)을 컴파일하려고 시도한 후에 발생했습니다. CLANG 테스트에 합격했지만 GCC 테스트는 실패합니다 (버전은 아래 참조).OSX 10.8.5 : GCC는
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
다음 프로그램 :
은 (sqlite3를 빌려) 출력을 제공
# 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);
}
:
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'으로 괜찮 컴파일 (
sqlite3.c
에 선을 28834-28889 교체) 당신은'수행 할 때 또한 무슨 일이 ... 4002001' # 만약 GCC_VERSION> = 4002001 || CLANG_VERSION> = 5001000'? –감사합니다. 이전 버전과 마찬가지로 실패합니다 (내 버전에서는 분명합니다). 내 clang 버전 문자열 인'Apple LLVM 버전 5.1 (clang-503.0.40) (LLVM 3.4svn 기반) '은 clang5 ** 및 clang5 확장 **이 아닌 다른 것을 의미합니까? – bliako
확장 기능은 기본적으로 기능이 현재 언어로 (언어 확장 또는 표준 언어 기능으로) 'Clang'에 의해 지원되는지, 그렇지 않다면 '0', '예'인 경우 '1'을 나타내는 데 사용됩니다. 어떤'sqlite3'을 소스에서 컴파일하려고합니까? –