2017-04-13 19 views
1

現在、xcodeのC++に問題があります。 fopen( "verShader.vsh"、 "r")を実行すると、NULLポインタが返されます。Xcodeプロジェクトソースファイル自動コピー

私は、/ Users/apple/Library/Developer/Xcode/DerivedData/HollowWorld -hghymrkhtbuguoaiwgp tundpakuz/Build/Prod ucts/DebugにverShader.vshを置くと、fopen()が機能します。しかし、main.cppの同じディレクトリにあるファイルは/ Users/apple/Developer/C++/HelloWorld/HelloWorldです。

私はプロジェクトをビルドすると自動的に "verShader.vsh"を実行ファイルのディレクトリにコピーできますか? enter image description here

答えて

0

のような通常のC/C++ファイルルーチンで使用することができ、私は最終的に「アドオンすることでこれを解決しましたコピーファイル "ビルド段階では enter image description here

1

"verShader.vshは" あなたためだmain.cppに

のディレクトリに入れている間に作業スペースが.../DerivedData/...であるとして、それはNULLポインタを返しますファイルへのパスを指定せずにファイル名 "verShader.vsh"を使用しています。 Mac(およびiOS)アプリケーションバンドルは特定の構造を持ち、実行可能ファイルや作業ディレクトリ以外の特定のサブディレクトリにすべてのリソースが格納されています。

私はプロジェクトをビルドすると自動的に "verShader.vsh"を実行ファイルのディレクトリにコピーできますか?

これは間違ったアプローチです。コピーしたいファイルのパスを知っている必要があります。一度それを知っていれば、コピーするのではなくコピーした場所で読むことができます。 Objective-CまたはSwiftでは、簡単です:

NSString * path = [[NSBundle mainBundle] pathForResource:@ "verShader" of type:@ "vsh"];

あなたはCore Foundationの使用して同じことを行うことができますC++では

CFBundleRef mainBundle = CFBundleGetMainBundle(); 
CFURLRef url = CFBundleCopyResourceURL(mainBundle, CFSTR("verShader"), CFSTR("vsh"), NULL); 
char path[255]; // space for the path 
Boolean success = CFURLGetFileSystemRepresentation(url, true, path, 255); 

(警告:私はCore Foundationのを使用するために必要なので、それがしばらくしているので、出発点として、上記のコードを使用しますが、ドン」にトンdocsを自分でチェックし、必要な修正を行うことについて恥ずかしがら。)

パスをしたら、あなたはfopen()

+0

私はCFURLRef burl = CFBundleCopyBundleURL(mainBundle)を試しました。 CFURLGetFileSystemRepresentation(url、true、path、255); burlは/ Library/Developer/Xcode/DerivedData/HelloWorld-hghymrkhtbuguoaiwgptundpakuz/Build/Products/Debugのディレクトリを返します。しかし、verShader.vshはmain.cppの同じディレクトリにあります。 –

+0

verShader.vshを/ Users/apple/Library/Developer/Xcode/DerivedData/HollowWorld-hghymrkhtbuguoaiwgptundpakuzに置くと、私の問題を理解しても分かりません。/Build/Products/Debug fopen()が動作します。しかし、main.cppの同じディレクトリにあるファイルは/ Users/apple/Developer/C++/HelloWorld/HelloWorldです。 –

+0

実行時に* main.cppファイルがありません。そのソースファイルはコンパイルされ、実行可能コードに変換されます。 'verShader.vsh'をあなたのコードがアクセスできるあなたのプログラムに組み込まれたファイルにしたいならば、それは*リソース*にする必要があります。そうすれば、アプリケーションがビルドされるときにアプリケーションのバンドルにコピーされます。ファイルシステムのどこかのファイルにしたいのであれば、ファイルへの*パス*を決定するコードを記述して、それが作業ディレクトリにあることを期待するのではなく、ファイルを使用する必要があります。私はそれがリソースであると仮定しましたが、いずれにしてもパスを提供する必要があります。 – Caleb

関連する問題