1

アプリケーションのレンダリング コードを C++ で記述し、それ以外はすべて Haskell で記述しようとしています。私の C++ コードは、boost ライブラリと Ogre3D ライブラリにリンクしています。

GHC でコンパイル済みの .o ファイルを使用して Haskell プログラムをコンパイル/リンクしようとしていますが、次のようなエラーが発生します。

undefined reference to `Ogre::Vector3::ZERO'

コードをリンクするためにこれまでに思いついたコマンドは次のとおりです。

ghc --make Main.hs obj/Debug/BaseApplication.o obj/Debug/Application.o -lstdc++ -L"C:/Ogre/OgreSDK_MinGW_v1-8-0/bin/Debug" -L"C:/Ogre/OgreSDK_MinGW_v1-8-0/bin/Release" -I"C:/Ogre/OgreSDK_MinGW_v1-8-0/include" -I"C:/Ogre/OgreSDK_MinGW_v1-8-0/include/OGRE" -I"C:/Ogre/OgreSDK_MinGW_v1-8-0/include/OIS" -I"C:/Ogre/OgreSDK_MinGW_v1-8-0/boost" -optl-Wl -optl--enable-runtime-pseudo-reloc -optl--enable-auto-image-base -optl--enable-auto-import -optl--add-stdcall-alias -optl-mthreads

2 つの BaseApplication.o と Application.o、私のファイルの 2 つ、Ogre3D と boost ライブラリもリンクしようとします。また、Code::Blocks からコピーしたリンカー オプションもいくつかあります。

Haskell 用の Ogre3D ( http://hackage.haskell.org/package/hogre )への小さなバインディングがあることは知っていますが、私はライブラリの初心者であり、ライブラリを学習するためのリソースはすべて C++ で書かれています。それをHaskellに翻訳しなければならないという障壁も持ちたくありません。

外部 C++ ライブラリを Haskell コードにリンクするにはどうすればよいですか? 明確にするために、私は C++ ルーチンに C ラッパーを使用して、名前がコンパイラーによって破壊されないようにしています。また、FFI を使用しています。Haskell にディレクトリを提供するために間違ったオプションを使用していますか、それとも何か不足していますか?

4

3 に答える 3

2

いくつかの理由から、必要なのは困難で面倒な作業です。

  • FFIはC++ではなくCのみで動作します(おそらくご存知であり、上記で言及されています)
  • 大きなC++ライブラリのCラッパーを作成することは、多くの理由で苦痛です。
  • Windows C ++ライブラリはMSコンパイラを使用することがよくあります。たとえば、Ogreでは​​MSバージョンはgccバージョンよりも適切にサポートされています(これは1つのケースに基づく観察であり、その背後にある実質的な事実ではありません)

Ogreについては、haskellラッパーも作成しました。http://www.hgamer3d.orgを参照してください

すでに多くの機能が含まれています。次のバージョン0.1.9にはCEGUIAPIも含まれる予定です。

于 2012-12-02T19:50:21.133 に答える
1

独自のラッパーを使用している場合は、そのようなプロジェクトへのリンクがあります:低レベルCOgre3Dインターフェイス

「未定義の参照」エラーに関しては、libkerは正しいので、Ogreライブラリを渡さず、それらへのパスのみを渡します。このようなものを追加してみてください-lOgreMain

于 2012-06-16T10:10:59.040 に答える
0

GHC (g++ ではなく gcc を使用) を使用して C++ コードをリンクすることは想定されていません。

libstdc++.so への参照を持ち、C インターフェイスを公開する自己完結型の C++ ライブラリ (.so) が必要です。GHC はリンクのために gcc を呼び出し、インライン関数の vtable 用の適切なシンボル/コードを生成しません (それらはコンパイル時ではなくリンク時に生成されます)。Bullet Physics の Haskell バインディングは、ほぼ同じ問題に遭遇しました。

Ogre は、C++ 固有のものをあまりにも多く使用するため、実際にはラップされるようには設計されていません。

于 2012-07-03T18:42:23.120 に答える