如何将C ++ / Ogre3D代码链接到Haskell

时间:2012-06-16 07:22:21

标签: c++ haskell ogre3d

我正在尝试使用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

它尝试链接两个BaseApplication.o和Ap​​plication.o,我的两个文件,以及Ogre3D和boost库。它还有一些我从Code :: Blocks中复制的链接器选项。

我知道对于Haskell(http://hackage.haskell.org/package/hogre)有一个小的Ogre3D绑定,但我是该库的初学者,所有用于学习库的资源都是用C ++编写的;我不希望有必要将其翻译成Haskell的障碍。

如何将外部C ++库链接到我的Haskell代码?为了清楚起见,我在C ++例程中使用了一个C包装器,以确保编译器不会破坏名称,并且我使用的是FFI。我是否使用错误的选项为Haskell提供目录,还是有些东西我不知道?

3 个答案:

答案 0 :(得分:2)

你想要的是一项艰巨而繁琐的工作,原因如下:

  • FFI仅与C合作,而不是C ++(您可能知道并且已经在上面提到过)
  • 为大型C ++库编写C包装器很多原因很痛苦
  • Windows C ++库通常使用MS编译器,例如在Ogre中,MS版本比gcc版本支持得更好(这是一个观察,基于一个案例,并不是真正的实质性事实)

对于Ogre,我还写了一个haskell包装器,请看这里:http://www.hgamer3d.org

它已包含许多功能,下一版本0.1.9甚至包含CEGUI API。

答案 1 :(得分:1)

如果你使用自己的包装器,这里是这个项目的链接:Low level C Ogre3D Interface

至于“未定义的引用”错误 - libker是对的,你不是传入Ogre库,只传递它们的路径。尝试添加-lOgreMain或类似的内容。

答案 2 :(得分:0)

你不应该使用GHC(使用gcc而不是g ++)来链接C ++代码。

你应该有自包含的C ++库(.so),它引用了libstdc ++。所以并暴露了C接口。 GHC调用gcc进行链接,并且不会为内联函数的vtable生成正确的符号/代码(它们是在链接时生成的,而不是在编译时生成的)。 Bullet Physics的Haskell绑定遇到了同样的问题,你可能想看看它。

Ogre实际上并不是为了包装而设计的,因为它使用了很多特定于C ++的东西。