GLFW アプリ (C++ で作成) を実行しています
次のように実行します。
./prog.app/Contents/MacOS/prog # from the command line
ただし、私のコードは相対パスのファイルを正しく読み取ることができません。
つまり、この Mac バンドルが現在のディレクトリを変更しているということだと思います。
1)それは何に変わりますか?2)これを制御できますか?
ありがとう!
多くの場合、これはユーザーのホームディレクトリです。それが保証されているかどうかはわかりませんが、Cocoaアプリ内でchdir()を使用できます。要件によっては、ファイルシステムのブックマーク(10.6以降)またはエイリアス(以前)を使用すると、ユーザーのエクスペリエンスが向上する場合があります。または、絶対パスでさえ、作業ディレクトリの変更に対して堅牢です。
このコードを使用して、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;
アプリの起動時に、現在の作業ディレクトリについて何も想定しないでください。Finderはこれについてかなり一貫していますが、アプリを起動する唯一の方法ではありません。たとえば、Xcodeでデバッグする場合、最初の作業ディレクトリは異なり、作業ディレクトリを期待どおりに設定する場合と設定しない場合がある他のさまざまな方法があります。まったく関係のないディレクトリのコマンドラインからアプリを起動してアプリをテストする必要があります。この状態でもファイルが見つかった場合は、問題はありません。
GLFW のソースを見ると、OSX では init 中に現在のディレクトリが明示的に変更されていることがわかります。 ここを見て、236 行目あたりまでスクロールします (または chdir を検索します)。
私は現在、GLFWが初期化中に明示的なchdirを実行する理由を理解しようとしているため、SOの質問を見つけました。OSX 以外のすべてのプラットフォームで動作するプログラムがあるため、これを発見しました。OSX では、相対パスを使用してデータ ファイルを見つけることができません。私の一時的な解決策は、メインの起動時に現在のディレクトリを取得し、GLFW の初期化後に現在のディレクトリをリセットすることです。