D+GLFW3のプログラムをアプリケーションバンドルにしようとしたらハマったのでメモ。
まずこういう構成でバンドルを作る。
Application.app
\_Contents
\_Info.plist
\_MacOS
\_実行ファイル
\_Resources
\_dylibとか
\_その他リソース
それで起動すると一瞬で落ちる。どうやらdylibが読み込めてないらしい。これによると通常の方法でアプリケーションを起動するとカレントワーキングディレクトリが/
になってしまうらしい。このせいでdylibやリソースなどの読み込みがうまくいっていなかった。そこで、プログラム中でchdir
してやる。
import std.path : dirName;
import std.file : chdir;
void main(string[] args) {
chdir(args[0].dirName.dirName ~ "/Resources");
...
}
これで一応動いたから良しとする。条件コンパイルを使えばマルチプラットフォームでも対応できる。
void main(string[] args) {
version (OSX) {
chdir(args[0].dirName.dirName ~ "/Resources");
}
...
}
余談
GLFW3ではOSXのアプリケーションバンドルから起動されている時glfwInit
内でカレントワーキングディレクトリをResources
にするらしい。でもDerelictGLFW3を使うときはdylibの読み込み時にchdir
しないといけないので意味がなかった。