在OSX Yosemite上使用加速框架进行编译

4

我最近升级到了Yosemite系统,但是在使用通过homebrew获取的gcc-4.9编译使用加速框架的C++程序时遇到了问题。我想知道是否有人有解决方案?在以前的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);

   ^
1个回答

8

这两个故障都是由clang的特性引起的,GCC不支持。您可以使用clang代替GCC,或者绕过它们。

第一个问题是<os/base.h>中的一个错误;它应该像对待__has_builtin等一样保护__has_extension未定义。您可以通过在包含系统标头之前添加以下内容来解决此问题:

#ifndef __has_extension
#define __has_extension(x) 0
#endif

第二个问题是GCC不支持块。你可以通过在include之前添加以下内容来解决这个问题:
#define vImage_Utilities_h
#define vImage_CVUtilities_h

这将阻止您使用一些vImage功能(即,与Core Graphics和Core Video的简化互操作性),但您无论如何都无法从GCC中使用这些功能,因此您不会失去任何东西。

这对我很有用,我试图让一个使用Accelerate的第三方程序在我的新Mac上编译。谢谢! - user632657

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接