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

How do I link C++/Ogre3D code to Haskell

本文关键字:代码 链接 Haskell Ogre3D C++      更新时间:2023-10-16

我正在尝试用C++为我的应用程序编写渲染代码,并在 Haskell 中编写其他所有内容。我的C++代码链接到boost和Ogre3D库。

我正在尝试将我的 Haskell 程序与 GHC 中编译的 .o 文件编译/链接无济于事,出现如下错误:

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 提供目录,或者我缺少什么?

你想要的是一项困难而繁琐的任务,原因如下:

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

对于Ogre,我还写了一个Haskell包装器,见这里:http://www.hgamer3d.org。

它已经包含了很多功能,下一个版本0.1.9甚至将包含CEGUI API。

如果您使用的是自己的包装器,这里是此类项目的链接:低级C Ogre3D接口。

至于"未定义的引用"错误 - libker 是对的,您不是在传递 Ogre libs,而是在传递它们的路径。尝试添加-lOgreMain或类似的东西。

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

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

Ogre 并不是真正为包装而设计的,因为它使用了太多特定于C++的东西。