2014-10-23 3 views
3

최근에 Yosemite로 업그레이드했지만 homebrew를 통해 얻은 gcc-4.9로 Accelerate Framework를 사용하는 C++ 프로그램을 컴파일하는 데 문제가있는 것 같습니다. 나는 누군가가 이것에 대한 해결책을 가지고 있는지 궁금 해서요? 이것은 이전 OSX 버전에서는 문제가되지 않았습니다.OSX에서 Accelerate Framework로 컴파일하기 Yosemite

예를 들어 다음 코드를 컴파일하는 것을 고려하십시오.

#include<iostream> 
#include<Accelerate/Accelerate.h> 
using namespace std; 
{ 
return 0; 
} 

그 소리와 함께 모든 일의 작품 (애플은 LLVM 버전 6.0 (그 소리-600.0.54)) 컴파일 할 때 :

clang++ -flax-vector-conversions -o main.out main.cpp -framework Accelerate 

그러나시는 g ++로 컴파일 - 4.9 (g ++ - 4.9 (브루 gcc49 4.9 0.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); 

^
,536,913,632을 10

답변

5

두 가지 오류는 GCC가 지원하지 않는 clang 기능으로 인해 발생합니다. GCC 대신 clang을 사용할 수도 있고, GCC를 해결할 수도 있습니다.

첫 번째 것은 <os/base.h>의 버그입니다.

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

두 번째 문제는 GCC 블록을 지원하지 않는다는 것입니다 : 당신이 시스템 헤더를 포함하기 전에 다음을 넣어이 문제를 해결할 수 등이 __has_builtin 위해하는 것처럼 정의되지 않은되고 __has_extension에 대해 보호해야합니다. (가) 포함하기 전에 다음을 넣어이 문제를 해결 할 수 있어야한다 :

#define vImage_Utilities_h 
#define vImage_CVUtilities_h 

이 일부 vImage의 기능을 사용하지 못하도록합니다 (즉, 코어 그래픽 및 코어 비디오와 단순화 된 상호 운용성),하지만 당신은 않을 것 어쨌든 GCC의 기능을 사용할 수 있었기 때문에 아무것도 포기하지 않았습니다.

+0

고마워,이 솔루션은 완벽하게 작동합니다. –

+0

이것은 제 새로운 Mac에서 Accelerate를 사용하여 타사 프로그램을 컴파일하려고하는 저에게 효과적이었습니다. 감사! – user632657