【问题标题】:Haskell FFI for pdflib用于 pdflib 的 Haskell FFI
【发布时间】:2011-04-06 17:25:30
【问题描述】:

我正在尝试在 64 linux 上使用 c2hs 为 pdflib 库 ( pdflib.com ) 编写 ffi。 您可以从他们的网站免费下载 pdflib(全功能评估)。

我尝试编译并运行他们的 hello.c 演示程序,它运行良好。

据我了解,我只需要 2 个文件即可使其工作:pdflib.h 和 libpdf.a

所以我把它们都放到 hello 文件夹中,写了一个 chs 文件,它编译并生成了 hs 文件。 但是当我尝试编译我的 Hello.hs 程序时,阴谋集团抱怨

Cabal:缺少对外部库的依赖: * 缺少 C 库:pdflib

我尝试通过 --extra-include-dirs 和 --extra-lib-dirs 为其指定文件夹名称,但没有帮助。

如何用 pdflib.h 和 libpdf.a 文件编译 haskell 程序?

【问题讨论】:

  • 首先:我假设您的 cabal 文件中有“extra-libraries: pdf”?您需要确保名称精确匹配(即与库文件相同,但没有“lib”前缀)。其次,我对 .a 文件的结果好坏参半,可能是由于我自己的无知,但对 .so 文件总是有成功的。
  • 谢谢!那确实有帮助。我不知道我需要删除“lib”前缀。现在我得到一堆其他错误,但这是一个不同的故事(gcc,makefiles,g++)

标签: haskell ffi


【解决方案1】:

从评论迁移到答案:

首先:我假设您的 cabal 文件中有“extra-libraries: pdf”?您需要确保名称精确匹配(即与库文件相同,但没有“lib”前缀)。其次,我对 .a 文件的结果好坏参半,这可能是由于我自己的无知,但对 .so 文件总是很成功。 – sclv 19 小时前

【讨论】:

  • 有没有办法将 .a 文件转换为 .so 文件?您如何处理来自 haskell 的 .so 文件?他们是否也需要 .h 文件?我可以使用与 .a 文件相同的 .h 文件吗? Pdflib 站点有不同语言的下载包,包括 java、perl、python 和 php。有趣的是,它们都包含特制的 .so 文件,例如 pdflib_java.so、pdflib_py.so 等。但没有包含头文件。有没有办法像在 Windows 中一样查看 .so 文件,有一些实用程序可以让您查看 dll。
  • .a 文件是静态链接库,.so 文件是动态的。如果 cabal 正在查找 .a 文件,那么您应该没问题——不过我不是专家。我希望您的其他问题不一定与静态/动态库的选择有关——我实际上在让 cabal 甚至找到 .a 而不是 .so 文件之前遇到了问题。
  • Pdflib 自述文件说使用 .a 文件编译时使用 g++ 而不是 gcc。我不确定 cabal 或 ghc 使用什么。在这一点上,我只需要放弃它,因为我既没有时间也没有这方面的专业知识。
  • @Vagif 好吧,那是你的问题。 GHC 通常不能直接绑定到 C++ 库。您需要将对 C++ 库的调用包装在您编写的 C 库中,然后使用它。我被告知这是一种皇家的痛苦。
【解决方案2】:

链接器需要能够找到您的 .a 文件。它将查看通常的 /usr/lib 路径。您可以将 pdflib 安装到常规系统位置(例如通过您的包管理器)吗?这将是最简单的路径。

【讨论】:

  • 有没有办法告诉它文件在哪里?我试图把它和 hs 文件放在同一个文件夹中。
  • 我试图将 libpdf.a 复制到 /usr/lib。阴谋集团仍然没有看到它
  • Ingo:cabal 选项的用法很奇怪,需要去掉“lib”前缀。我不知道。是的,我下载了 64 位版本,在尝试他们的 hello.c 示例时它编译并运行良好。
猜你喜欢
  • 1970-01-01
  • 2011-07-28
  • 1970-01-01
  • 1970-01-01
  • 2011-08-05
  • 2015-06-02
  • 1970-01-01
  • 2017-04-10
  • 1970-01-01
相关资源
最近更新 更多