2017-02-14 17 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: НКУ не распознает расширение 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' ... Кроме того, что происходит, когда вы делаете' #if 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

«не понимает версию Apple Clang, которую вы имеете (5.1), не поддерживает встроенные функции»: вы уверены? Действительно ли clang 5.1 в OSX 10.8.5 означает какую-то другую версию (которая иногда случается на этих яблоках os) clang, которая не поддерживает эти расширения? – bliako

+0

Да, Clang/LLVM на macOS - это не тот Clang, который был бы на Linux. Это собственная модифицированная версия Apple, и некоторые реализованные функции имеют возможность немного отстать от своего аналога Linux. –

+0

Я отправил сообщение об ошибке на форум sqlite3 и будет ждать ответа. – bliako