いくつかのCコードを作成してから、FFIを介してそのCコードを参照する必要があります。osxのghciの内側からバインディングを使用したいと思います。私の制約の1つは、Cソースを.cabalファイルのghcに渡すことはできないということです。これは、ghcの次のリリースで修正される可能性のあるghc / cabalの制限によるものです(ただし、コードを現在および古いリリースで機能させたい)。詳細については、このバグを参照してください。
そのバグの要点は、CコードをいくつかのObjective-Cモジュールでコンパイルする必要があり、ghcがそれらをリンカースクリプトとして誤って解釈することです。私は多くのことを試しましたが、makefileを使用して自分でファイルを作成することだけがうまくいきました。実際には、これは問題にはなりません。自分で作成していない外部Cライブラリを使用することにした場合と同じであるためです。この問題のために、さまざまなオプションを使用して簡単に再構築できる別のCライブラリであるとしましょう。
Cライブラリを.aとしてビルドすると、ghciは.dylibを開くことができないと文句を言います。私の最初の質問は、なぜghciに.dylibが必要なのか、それを実際に使用するのかということです。
dylibをビルドすると、コードをghciにロードするときにセグメンテーション違反が発生します。
このバインディングは、LinuxとWindowsの両方の他のプラットフォームですでに機能しており、ghciを使用する代わりにコンパイルしているときはosxで正常に機能することに注意してください。この問題は、osx/ghciコンボに固有のものです。
上記のトレースでは、gdbを使用していますが、gdbを使用しているかどうかに関係なくクラッシュします。クラッシュの原因となった行まで追跡しました。
void _glfwClearWindowHints( void )
{
memset( &_glfwLibrary.hints, 0, sizeof( _glfwLibrary.hints ) );
}
問題の原因は、memset行ですが、実際には、ghci内で実行すると、のヒント構造への書き込みが_glfwLibrary
メモリアクセス違反になるという問題があります。ヒント構造体は、単なるintの集まりです。それは非常にフラットでシンプルなので、問題は私が物事をリンクする方法またはghciがコードをロードする方法のいずれかに問題があると思います。
dylibと.aをビルドするために使用するmakefileのビットは次のとおりです。
GCCFLAGS := $(shell ghc --info | ghc -e "fmap read getContents >>= \
putStrLn . unwords . read . Data.Maybe.fromJust . lookup \
\"Gcc Linker flags\"")
FRAMEWORK := -framework Cocoa -framework OpenGL
GLFW_FLAG := $(GCCFLAGS) -O2 -fno-common -Iglfw/include -Iglfw/lib \
-Iglfw/lib/cocoa $(CFLAGS)
all: $(BUILD_DIR)/static/libglfw.a $(BUILD_DIR)/dynamic/libglfw.dylib
$(BUILD_DIR)/dynamic/libglfw.dylib: $(OBJS)
$(CC) -dynamiclib -Wl,-single_module -compatibility_version 1 \
-current_version 1 \
$(GLFW_FLAG) -o $@ $(OBJS) $(GLFW_SRC) $(FRAMEWORK)
$(BUILD_DIR)/static/libglfw.a: $(OBJS)
ar -rcs $@ $(OBJS)
ほとんどのフラグはGLFWMakefileから直接取得されるため、そのライブラリに対して正しいはずだと思います。
最初の行は少し奇妙に見えますが、それは私がこの問題に使用した解決策です。
プラットフォームの詳細:
- OSX 10.6.6
- x86_64
- 4コア
- Haskellプラットフォームインストーラーを介してインストールされたGHCバージョン7.0.3
- ソースリポジトリ:https ://github.com/dagit/GLFW-b
編集:ここに私の質問があります:
- これはghciで動作する必要がありますか?
- もしそうなら、私は何を間違っているのですか、またはどうすればクラッシュを修正できますか?
- ghciを使用した静的な.aバージョンのライブラリを使用できますか?