【问题标题】:Compiling with Accelerate Framework on OSX Yosemite在 OSX Yosemite 上使用 Accelerate Framework 进行编译
【发布时间】:2014-12-19 01:28:21
【问题描述】:

我最近升级到 Yosemite,但似乎在编译使用 Accelerate Framework 和通过自制软件获得的 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);

   ^

【问题讨论】:

    标签: c++ homebrew osx-yosemite accelerate-framework


    【解决方案1】:

    这两个故障都是由 GCC 不支持的 clang 功能引起的。您可以使用 clang 代替 GCC,也可以解决它们。

    第一个是&lt;os/base.h&gt;中的一个bug;它应该防止 __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 的这些功能,因此您不会放弃任何东西。

    【讨论】:

    • 这对我尝试使用 Accelerate 在我的新 Mac 上编译的第 3 方程序很有用。谢谢!
    猜你喜欢
    • 2016-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-17
    • 2015-05-17
    相关资源
    最近更新 更多