从 Java 调用 Haskell,中间用 C 调用

2024-01-08

这可能听起来像一场噩梦,但我真的很想让它发挥作用。我大部分时间都在使用这个例子:从 Haskell 调用 C http://www.haskell.org/haskellwiki/Calling_Haskell_from_C我正在尝试让它在 ubuntu 上运行。

我在java中运行这个:

package test;

public class JniTest {
    public native int fib(int x);
}

使用 javah 创建 .h 文件后,在 c 中执行此操作:(test_JniTest.c)

#include "test_JniTest.h"
#include "Safe_stub.h"

JNIEXPORT jint JNICALL Java_test_JniTest_fib(JNIEnv * e, jobject o, jint f)
{
  return fibonacci_hs(f);
}

然后在 haskell 中参考(在存根之前):(Safe.hs)

module Safe where

import Foreign.C.Types

fibonacci :: Int -> Int
fibonacci n = fibs !! n
    where fibs = 0 : 1 : zipWith (+) fibs (tail fibs)

fibonacci_hs :: CInt -> CInt
fibonacci_hs = fromIntegral . fibonacci . fromIntegral

foreign export ccall fibonacci_hs :: CInt -> CInt

这就是我正在尝试编译它的内容:

ghc -c -O Safe.hs

其次是:

ghc -shared -o libTest.jnilib -optc -O test_JniTest.c -I/usr/lib/jvm/java-6-sun-1.6.0.26/include -I/usr/lib/jvm/java-6-sun-1.6.0.26/include/linux

我收到此错误:

/usr/bin/ld: test_JniTest.o: 重定位 R_X86_64_PC32 进行共享时不能使用未定义的符号“fibonacci_hs” 目的;使用 -fPIC /usr/bin/ld 重新编译:最终链接失败:错误值 Collect2: ld 返回 1 退出状态

无论如何,我都不是 C 专家,也不知道该怎么办。我尝试使用 -fPIC 进行各种编译,但不断出现相同的错误。知道我可能做错了什么吗?

Thanks!


尽管我已经在这里回答了这个问题:Java和Haskell之间的通信 https://stackoverflow.com/questions/10370177/communication-between-java-and-haskell,由于这个问题更多的是关于错误本身,我将在这里添加详细信息。这个问题源于 Haskell 不能很好地支持共享库,而 Java 则需要它们。将插件构建为 Haskell 共享库 http://www.well-typed.com/blog/30为我们提供了这种见解和解决方法:

原则上,您可以在链接步骤中使用 -shared,而不使用 -dynamic。这意味着将 rts 所有基础库静态链接到新的共享库中。这将形成一个非常大但独立的共享库。然而,这需要使用 -fPIC 构建所有静态库,以便代码适合包含到共享库中,但我们目前不这样做。

如果我们再次使用 ldd 来查看我们制作的 libfoo.so,我们会注意到它缺少对 rts 库的依赖项。这是我们尚未解决的问题,因此目前我们可以自己添加依赖项:

$ ghc --make -dynamic -shared -fPIC Foo.hs -o libfoo.so \
 -lHSrts-ghc6.11 -optl-Wl,-rpath,/opt/ghc/lib/ghc-6.11/

这是一种解决方法,因为它要求我们在构建时知道 rts 库的版本。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 Java 调用 Haskell,中间用 C 调用 的相关文章

随机推荐

  • 有什么方法可以用预处理器替换部分单词吗?

    我的 Objective C 课上有类似的东西 interface PREFIX MyClass end 我想使用预处理器将其转换为 interface AwesomeMyClass end 所以像 define PREFIX Awesom
  • C/C++ 中文件名中的下划线有什么规则吗?

    我知道有使用下划线的规则身份标识在 C C 中 https stackoverflow com a 228797 1995714 在源代码文件名中使用它们有什么规则吗 例如 对于以下划线开头或结尾的文件名是否有任何限制 或者将下划线作为最后
  • java中如何将对象添加到ArrayList中

    这里有两个类 查询语句和stackov 数组列表用于存储查询语句类的对象 但是最近添加的对象会覆盖之前的对象 如何添加对象以使它们不被覆盖 查询语句 java public class QuerySentence public static
  • 将 WinForms 应用程序与本机 DLL 一起打包

    尝试找出如何使用 Visual Studio 2017 Desktop Bridge 应用程序打包项目 打包以下解决方案 NET 库 DLL WinForms 可执行文件引用 1 本机 C DLL 通过 DllImport 导出 1 和 2
  • el-api-1.0.jar - jar 未加载 - 违规类:javax/el/Expression.class

    我正在尝试使用 RestEasy 运行一个简单的安静服务 以下是我的设置 汤姆猫7 Eclipse 和 Maven Maven 安装并将 war 文件复制到 webapps 文件夹 部署 war 文件时 catalina out 文件会显示
  • 使用 strtod strtof atof printf 进行区域设置不变的字符串处理?

    是否有计划添加在当前语言环境下不变的 C 标准库字符串处理函数版本 目前有很多脆弱的解决方法 例如来自 jansson strconv c 的 static void to locale strbuffer t strbuffer cons
  • 将 c 字符串中的字符转换为其转义序列

    我需要一个像这样的函数字符串ToLiteral 字符串输入 from 这个帖子 https stackoverflow com questions 323640 can i convert a c string value to an es
  • 如何在存储过程之间共享数据[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 在 MS SqlServer 中 存
  • Lighttpd 配置,.我的查询字符串中的(点)导致 404

    我的网站上有一个地址 如下所示 http www example com lookup q http 3A 2F 2Fgigaom com 2F2010 2F10 2F10 2f Angry birds for windows 7 phon
  • Symfony2:设置 cookie

    我正在尝试在登录控制器中设置 cookie 以实现 记住我 系统 尽管我使用了在网上找到的确切代码 但对我来说事情还是出了问题 我希望你能帮我弄清楚我错过了什么 让我们看一下代码 public function loginAction Re
  • 为什么short在C中的结构体中存储为4个字节?

    我有以下两个结构 问题是 sizeof Content 返回 160 该结构由 11 个短整型 6 个整数 76 个字符 7 个浮点 1 个双精度组成 总共添加到 158 个字节 我数了三遍 还是有2个字节的差别 typedef struc
  • 如何从组件内部调用组件的destroy?

    我有一个模态组件 我希望能够在用户单击 x 按钮时销毁它 我还有一个通知弹出窗口 它会在一段时间后自行销毁 但我想让用户能够通过以下方式关闭它 x 按钮也是如此 我知道我可以将事件传递给组件 但我认为如果组件具有自毁性 那就更好了 对于这种
  • Eclipse C/C++ 中的发现选项

    我不是一名程序员 最近才决定深入研究使用 Eclipse C C 来编程 ARM 微控制器 而我的问题是设置 IDE 基本上 我遵循这里的方向 https openwsn atlassian net wiki display OW GNU
  • 使用 tomcat 管理器应用程序相对于复制到 webapp 目录的优点

    我最近一直在思考 为什么要使用 tomcat 管理器来部署 取消部署 war 到你的服务器 与简单地将其复制到 webapps 文件夹方法和从 webpass 文件夹删除方法相比 其优点 缺点是什么 另外 当删除战争时 tomcat 的清理
  • 二进制 R 热图仍然显示梯度

    我正在尝试在 R 中绘制二进制数据矩阵 11 x 1500 的热图 heatmap y col hmcols 矩阵 y 看起来像这样 1 2 3 4 5 6 7 8 9 10 11 12 13 1 0 0 0 0 1 1 1 1 1 1 1
  • Swift 中的图像加密

    我在用IDZSwiftCommonCrypto使用 StreamCryptor 进行图像加密 其 GitHub 页面上有一个示例 https github com iosdevzone IDZSwiftCommonCrypto https
  • C# 折线图如何创建垂直线

    我有一个折线图 例如这样 我想画一条垂直线 其底部有一个标签 当我将标签拖动到这些 x 点上方时 我希望该标签以其垂直线穿过图表的 x 点 我将得到带标签的线与 Y 轴匹配的 y 点 例如 我怎样才能做到这一点 此解决方案允许您左右拖动注释
  • 在Java中,如何测试数组是否包含相同的值?

    我正在寻找一种方法来检测数组 列表 中的所有对象是否相同 e G arraylist1 1 1 1 1 elements are the same arraylist2 1 1 0 1 elements are not the same 感
  • Java9多模块Maven项目测试依赖关系

    我有一个包含三个模块的多模块 Maven 项目core utils and test utils Core 有以下依赖定义
  • 从 Java 调用 Haskell,中间用 C 调用

    这可能听起来像一场噩梦 但我真的很想让它发挥作用 我大部分时间都在使用这个例子 从 Haskell 调用 C http www haskell org haskellwiki Calling Haskell from C我正在尝试让它在 u