【问题标题】:C-extensions in DrRacketDrRacket 中的 C 扩展
【发布时间】:2014-02-01 06:19:47
【问题描述】:

我有一个适用于 Racket 的 C 扩展。在 Racket CLI 和 DrRacket 的交互窗口中,它就像一个魅力。但是,我无法让它在 DrRacket 的定义窗口中工作,这将非常有用,因为这是我的学生开发程序的界面。

问题似乎是扩展中的定义没有“看到”(或注册或其他东西)。该模块已加载(或至少已找到),但 DrRacket 抱怨它没有执行权限,我不明白。

在 C 代码中,我将扩展声明为模块,并尝试了两种包含方法:

(加载扩展“racket_extension.so”) 和 (需要“racket_extension.rkt”);这要求您将其放在相对于当前工作文件夹的文件夹中,如下所示: “编译/原生/x86_64-linux/3m/racket_extension_rkt.so”

这两种方法都不起作用。第一种情况没有报错,但是外部的定义没有注册(“未定义”)。

在第二种情况下 DrRacket 给出错误: 禁止(执行)访问 ....compiled/native/x86_64-linux/3m/racket_extension_rkt.so 但为什么呢?

有没有人知道我怎样才能让它工作?我错过了什么?

谢谢! 马克

【问题讨论】:

  • 我没有给你答案,但我认为如果你在 Racket 邮件列表中提出这个问题,你更有可能得到答案:lists.racket-lang.org/users
  • 谢谢阿苏姆,我会的。我已经把它放在了 IRC 频道上,但到目前为止没有任何回应。

标签: c++ c racket


【解决方案1】:

您如何编译和链接您的扩展程序?您使用的是 raco ctool 还是 gcc?您是否在与编译目录相同的目录中执行 DrRacket?我通常测试我的扩展的方式是执行:drracket my_ext_test.rkt 在与我的编译目录相同的目录中。这在过去对我来说一直是个问题。另外,如果它说该操作被禁止,您是否尝试更改.so 的权限?也许就是这么简单。我将从简单的示例Writing Racket Extensions 开始,并确保您可以让 hello world 程序在定义窗口中工作。我个人从未遇到过您提到的问题,但我也在 Linux 上运行。

【讨论】:

  • 谢谢,我最近得到了它与来自社区的最终细节一起工作。它与 .so 的权限无关,但显然我将 C 函数导出到顶级命名空间而不是模块命名空间,所以我更改了 scheme_add_global("function-one",proc,env) info scheme_add_global(" function-one",proc,mod_env) 并且它起作用了。
  • 我在 github 上放了一个使用 C 扩展的项目:github.com/marcdinkum/racket_midi 看看,Makefile 显示了我是如何编译和链接的。如果我知道该怎么做,我想我现在可以结束这个问题了:-)
猜你喜欢
  • 2019-01-19
  • 2014-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-22
  • 2013-10-16
  • 1970-01-01
相关资源
最近更新 更多