5

次のようなOSXコアライブラリを含むObjective CファイルをGCC 4.7でコンパイルできません。

#import <Foundation/Foundation.h>

結果として生じるエラーは、常に奇妙な GCC 出力になります。

gcc -c -pipe -O2 -arch x86_64 -mmacosx-version-min=10.8 -Wall -W  -I/usr/local/Cellar/qt/4.8.4/mkspecs/macx-g++ -I../TerrainFluid -I../TerrainFluid/external -I../TerrainFluid -I. ../TerrainFluid/external/osx_bundle.mm -o osx_bundle.o

In file included from 

/System/Library/Frameworks/Foundation.framework/Headers/Foundation.h:123:0,
                 from ../TerrainFluid/external/osx_bundle.mm:24:
/System/Library/Frameworks/Foundation.framework/Headers/NSTask.h:69:24: error: expected unqualified-id before '^' token
/System/Library/Frameworks/Foundation.framework/Headers/NSTask.h:69:24: error: expected ')' before '^' token
In file included from /System/Library/Frameworks/Foundation.framework/Headers/Foundation.h:159:0,
                 from ../TerrainFluid/external/osx_bundle.mm:24:
/System/Library/Frameworks/Foundation.framework/Headers/NSUserScriptTask.h:36:15: error: expected unqualified-id before '^' token
/System/Library/Frameworks/Foundation.framework/Headers/NSUserScriptTask.h:36:15: error: expected ')' before '^' token
/System/Library/Frameworks/Foundation.framework/Headers/NSUserScriptTask.h:37:39: error: expected type-specifier before 'NSUserScriptTaskCompletionHandler'
/System/Library/Frameworks/Foundation.framework/Headers/NSUserScriptTask.h:53:15: error: expected unqualified-id before '^' token
/System/Library/Frameworks/Foundation.framework/Headers/NSUserScriptTask.h:53:15: error: expected ')' before '^' token
/System/Library/Frameworks/Foundation.framework/Headers/NSUserScriptTask.h:54:70: error: expected type-specifier before 'NSUserUnixTaskCompletionHandler'
/System/Library/Frameworks/Foundation.framework/Headers/NSUserScriptTask.h:68:15: error: expected unqualified-id before '^' token
/System/Library/Frameworks/Foundation.framework/Headers/NSUserScriptTask.h:68:15: error: expected ')' before '^' token
/System/Library/Frameworks/Foundation.framework/Headers/NSUserScriptTask.h:69:82: error: expected type-specifier before 'NSUserAppleScriptTaskCompletionHandler'
/System/Library/Frameworks/Foundation.framework/Headers/NSUserScriptTask.h:86:15: error: expected unqualified-id before '^' token
/System/Library/Frameworks/Foundation.framework/Headers/NSUserScriptTask.h:86:15: error: expected ')' before '^' token
/System/Library/Frameworks/Foundation.framework/Headers/NSUserScriptTask.h:87:72: error: expected type-specifier before 'NSUserAutomatorTaskCompletionHandler'
In file included from /System/Library/Frameworks/Foundation.framework/Headers/Foundation.h:160:0,
                 from ../TerrainFluid/external/osx_bundle.mm:24:
/System/Library/Frameworks/Foundation.framework/Headers/NSXPCConnection.h:46:11: error: expected unqualified-id before '^' token
/System/Library/Frameworks/Foundation.framework/Headers/NSXPCConnection.h:46:11: error: expected ')' before '^' token
/System/Library/Frameworks/Foundation.framework/Headers/NSXPCConnection.h:46:11: error: expected ';' before '^' token
/System/Library/Frameworks/Foundation.framework/Headers/NSXPCConnection.h:47:11: error: expected unqualified-id before '^' token
/System/Library/Frameworks/Foundation.framework/Headers/NSXPCConnection.h:47:11: error: expected ')' before '^' token
/System/Library/Frameworks/Foundation.framework/Headers/NSXPCConnection.h:47:11: error: expected ';' before '^' token
make: *** [osx_bundle.o] Error 1

この問題を解決する方法は、Objective C ファイルには Apple コンパイラを使用し、残りのコードには g++ (4.7) を使用することでした。

gcc -> /usr/bin/llvm-gcc
g++ -> /usr/local/bin/g++-4.7

すべてのコードに clang を使用したはずですが、まだ OpenMP をサポートしておらず、gcc-4.2 は C++11 をサポートしていません。

が使用したサンプル ファイルは次のとおりです (これは、Wildfire Games OSX Resource Bundle loader です)。Apple が GCC でのコンパイルを停止するために GCC ブロッカーを導入したというブログ投稿を読みました。

Apple 以外の GCC (GCC 4.7 など) でコードをコンパイルする方法はありますか? これまでのところ、Apple コンパイラを使用する以外に、この問題に関するドキュメントは見つかりませんでした。

4

1 に答える 1

0

最初のエラーは問題を示しています。

@property (copy) void (^terminationHandler)(NSTask *) NS_AVAILABLE(10_7, NA);

これがBlocks 拡張機能です。メインラインの GCC はブロックのサポートを実装していません。

于 2013-10-16T16:19:25.910 に答える