我正在尝试使用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和Application.o,我的两个文件,以及Ogre3D和boost库。它还有一些我从Code :: Blocks中复制的链接器选项。
我知道对于Haskell(http://hackage.haskell.org/package/hogre)有一个小的Ogre3D绑定,但我是该库的初学者,所有用于学习库的资源都是用C ++编写的;我不希望有必要将其翻译成Haskell的障碍。
如何将外部C ++库链接到我的Haskell代码?为了清楚起见,我在C ++例程中使用了一个C包装器,以确保编译器不会破坏名称,并且我使用的是FFI。我是否使用错误的选项为Haskell提供目录,还是有些东西我不知道?
答案 0 :(得分:2)
你想要的是一项艰巨而繁琐的工作,原因如下:
对于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 ++的东西。