質問
私は
(私はC ++で書いた)GLFWアプリを実行していますよ 次のように私はそれを実行します:
./prog.app/Contents/MacOS/prog # from the command line
しかし、私のコードは正常に相対・パス・ファイルを読み取ることができません。
だから私は何が起こっていることは、このMacのバンドルは、私の現在のディレクトリを変更していることであると考えています。
1)何それはそれを変更するのですか? 2)私はこれを制御することができますか?
ありがとうございます。
解決
アプリが起動されたときに、現在の作業ディレクトリについての仮定をしないでください。 Finderはこのことについて合理的に一致しているが、それはアプリを起動するための唯一の方法ではありません。例えばXcodeの下でのデバッグ時の初期作業ディレクトリは異なるであろう、と予想されるように、または作業ディレクトリを設定してもしなくてもよい様々な他の方法があります。あなたは全く関係のないディレクトリでコマンドラインから起動して、アプリをテストする必要があります - それはまだあなたが良い形にしているこの条件の下でそのファイルを見つけた場合、
。他のヒント
あなたはPROGの場所を見つけるために、コードのこの部分を使用することができます。
#include <mach-o/dyld.h>
char exe_path[MAXPATHLEN];
char link_path[MAXPATHLEN];
uint32_t size = sizeof(exe_path);
if (_NSGetExecutablePath(exe_path, &size) != 0)
assert();
if (realpath(exe_path, link_path) == 0)
assert();
return link_path;
よく、それは、ユーザのホームディレクトリです。私はそれが保証されていますかどうかわからないんだけど、あなたはココアのアプリ内にchdir()を使用することができます。あなたは、ファイルシステムのブックマーク(10.6以降)またはエイリアス(以前)を使用する場合は、あなたの要件に応じて、ユーザーがより良い経験を有することができます。まだ作業ディレクトリを変更することに対して頑健である、あるいは絶対パス、。
、あなたはOSX上のinitの間にそれが明示的にカレントディレクトリを変更していることがわかります。 ここを見て、およそライン236にスクロールダウン(またはCHDIRで検索)。
私は現在、GLFWは、初期化時に明示的にchdirを行う理由を理解しようとしているので、私はあなたのSO質問を見つけました。私はOSXを除くすべてのプラットフォーム上で動作するプログラムを持っているので、私はこれを発見しました。 OSX上では、相対パスを使用してのデータファイルを見つけることができません。私の一時的な解決策は、現在のディレクトリを取得するときに、メイン開始とGLFWを初期化した後、現在のディレクトリをリセットすることです。