Проблема в нескольких словах: на 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: НКУ не распознает расширение 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
'sqlite3' компилирует нормально с' CLANG_VERSION: 8000000', 'GCC_VERSION: 4002001' ... Кроме того, что происходит, когда вы делаете' #if GCC_VERSION> = 4002001 || CLANG_VERSION> = 5001000'? –
Спасибо. он не работает по-прежнему (это очевидно из моих версий). Вы знаете, возможно ли, что моя строка версии clang: 'Apple LLVM version 5.1 (clang-503.0.40) (на основе LLVM 3.4svn)' означает что-то, кроме clang5 **, с расширениями clang5 **? – bliako
Расширения в основном используются, если функция поддерживается «Clang» на текущем языке (либо как расширение языка, либо стандартная функция языка), либо «0», если нет, и «1», если да. Какой 'sqlite3' вы пытаетесь скомпилировать из источника? –