Недавно я обновился до Yosemite, но, похоже, возникла проблема при компиляции программ на C ++, использующих Accelerate Framework, с gcc-4.9, полученным с помощью homebrew. Мне было интересно, есть ли у кого-нибудь решения для этого? Это не было проблемой в предыдущих версиях OSX.
В качестве примера рассмотрим компиляцию следующего кода.
#include<iostream>
#include<Accelerate/Accelerate.h>
using namespace std;
{
return 0;
}
При компиляции с помощью clang все работает (Apple LLVM версии 6.0 (clang-600.0.54)):
clang++ -flax-vector-conversions -o main.out main.cpp -framework Accelerate
Но при компиляции с g ++ — 4.9 (g ++ — 4.9 (Homebrew gcc49 4.9.1) 4.9.1):
g++-4.9 -flax-vector-conversions -o main.out main.cpp -framework Accelerate
Я получаю следующие ошибки компиляции:
> g++-4.9 -flax-vector-conversions -o main.out main.cpp -framework Accelerate
In file included from /usr/include/os/object.h:27:0,
from /System/Library/Frameworks/Accelerate.framework/Frameworks/vecLib.framework/Headers/LinearAlgebra/base.h:6,
from /System/Library/Frameworks/Accelerate.framework/Frameworks/vecLib.framework/Headers/LinearAlgebra/LinearAlgebra.h:10,
from /System/Library/Frameworks/Accelerate.framework/Frameworks/vecLib.framework/Headers/vecLib.h:65,
from /System/Library/Frameworks/Accelerate.framework/Headers/Accelerate.h:20,
from main.cpp:2:
/usr/include/os/base.h:113:20: error: missing binary operator before token "("#if __has_extension(attribute_overloadable)
^
/usr/include/os/base.h:119:54: error: missing binary operator before token "("#if __has_feature(objc_fixed_enum) || __has_extension(cxx_strong_enums)
^
In file included from /usr/include/dispatch/dispatch.h:51:0,
from /System/Library/Frameworks/IOKit.framework/Headers/IOKitLib.h:56,
from /System/Library/Frameworks/CoreGraphics.framework/Headers/CGDisplayConfiguration.h:8,
from /System/Library/Frameworks/CoreGraphics.framework/Headers/CoreGraphics.h:41,
from /System/Library/Frameworks/Accelerate.framework/Frameworks/vImage.framework/Headers/vImage_Utilities.h:14,
from /System/Library/Frameworks/Accelerate.framework/Frameworks/vImage.framework/Headers/vImage.h:200,
from /System/Library/Frameworks/Accelerate.framework/Headers/Accelerate.h:24,
from main.cpp:2:
/usr/include/dispatch/object.h:143:15: error: expected unqualified-id before '^' token
typedef void (^dispatch_block_t)(void);
^
/usr/include/dispatch/object.h:143:15: error: expected ')' before '^' token
/usr/include/dispatch/object.h:362:3: error: 'dispatch_block_t' has not been declared
dispatch_block_t notification_block);
^
Обе ошибки вызваны функциями лязга, которые GCC не поддерживает. Вы можете использовать Clang вместо GCC или обойти их.
Первая ошибка в <os/base.h>
; это должно защищать от __has_extension
быть неопределенным так же, как это делает для __has_builtin
и т. д. Вы можете обойти эту проблему, добавив следующее перед включением системных заголовков:
#ifndef __has_extension
#define __has_extension(x) 0
#endif
Вторая проблема заключается в том, что GCC не поддерживает блоки. Вы должны быть в состоянии обойти это, поставив следующее перед включением:
#define vImage_Utilities_h
#define vImage_CVUtilities_h
Это не позволит вам использовать некоторые функции vImage (а именно, упрощенную совместимость с Core Graphics и Core Video), но вы все равно не сможете использовать эти функции из GCC, поэтому вы ничего не откажетесь.