如何将C++/Ogre3D代码链接到Haskell
How do I link C++/Ogre3D code to Haskell
我正在尝试用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++的东西。
- 下面是我为检测链接列表中的循环而制作的代码
- 尝试链接我的着色器时,我收到错误代码"error c5145 must write to gl_position"
- 你能检查一下为什么在这个代码中从链接列表中删除项目不起作用吗
- 使用不同的链接器会产生不同的机器代码吗
- Netbeans 10:错误:链接器命令失败,退出代码为 1(使用 -v 查看调用)
- 如何在 android ndk 上链接 C 和 C++ 代码,以及 C 和 C++ 运行时库(包括 STL)?
- 链接器命令失败,macOS 上的退出代码为 1(使用 -v 查看调用)
- CMake 错误:链接器命令失败,退出代码为 1 和 cpp.o 文件
- clang:错误:链接器命令失败,退出代码为 1(使用 -v 查看调用) - 体系结构的未定义符号 x86_64:
- 在将C全局变量与C 代码链接起来的麻烦
- OpenCV2 代码链接错误
- 从 C 代码链接错误调用C++函数(使用 gcc 进行链接)
- 将 Rcpp 与 C 代码链接,以实现自适应城域拒绝采样
- 分析共享库是否存在重复代码链接
- 将静态 C 库与C++代码链接时出现"undefined reference to"错误
- visual Can用VC10(sp1)编译的C++库可以通过用VC11编译的代码链接
- 在windows上链接Python到我的c++代码-链接错误
- 在OSX上用c++代码链接HealPix
- C++代码链接中的错误:警告 C4190:类型指定了 C 链接,但返回与 C 不兼容的 UDT
- 与 CUDA 代码链接时出错:__cudaRegisterLinkedBinary_的多个定义