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

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

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

如何将外部 C++ 库链接到我的 Haskell 代码?需要明确的是,我在 C++ 例程上使用了 C 包装器,以确保名称不会被编译器破坏,并且我使用的是 FFI。我是否使用了错误的选项来为 Haskell 提供目录,或者我缺少什么?

4

3 回答 3

2

您想要的是一项艰巨而繁琐的任务,原因有两个:

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

对于 Ogre,我还编写了一个 haskell 包装器,请参见此处:http ://www.hgamer3d.org 。

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

于 2012-12-02T19:50:21.133 回答
1

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

至于“未定义的引用”错误——libker 是正确的,你没有传入 Ogre 库,只有指向它们的路径。尝试添加-lOgreMain或类似的东西。

于 2012-06-16T10:10:59.040 回答
0

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

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

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

于 2012-07-03T18:42:23.120 回答