【问题标题】:Crystal C binding, simple hello world example.Crystal C 绑定,简单的 hello world 示例。
【发布时间】:2017-08-04 01:29:56
【问题描述】:

我试图弄清楚水晶中的 c 绑定是如何工作的。对于初学者,我想知道如何将一个简单的 hello world c 函数包含到水晶中。从基础开始总是好的,对吗?这是我想要包含的功能:

#include <stdio.h>

void hello(const char * name){
  printf("Hello %s!\n", name);
}

【问题讨论】:

  • 从长远来看,您将实现一个动态链接库,例如libawesome.so(这在 C 方面很复杂),然后您可以像通常的示例一样使用它:@[Link("awesome")]
  • @OlehPrypin 感谢您的评论。我实际上只是在调查那个。非常感谢。
  • @Jake 我最近创建了一个小演示,展示了如何完成此操作:github.com/ethagnawl/crystal-c-interop-demo 希望它具有启发性!
  • @pdoherty926,谢谢,我今天向一些人展示了它,他们很感激。好工作。非常感谢大家。
  • @pdoherty926 不错。您的解决方案与我的非常接近。像我使用的那样使用 .a 而不是 .o 有什么优势? .so 看起来很标准,但对于一个简单的 1 函数库来说可能有点矫枉过正。

标签: crystal-lang static-binding


【解决方案1】:

我也花了一点时间才弄清楚。首先,您必须将 C 文件编译成一个对象。在 gcc 中,您将运行 gcc -c hello.c -o hello.o

然后在水晶文件中,您需要链接到 C 对象。这是一个例子:

#hello.cr
@[Link(ldflags: "#{__DIR__}/hello.o")]

lib Say 
  fun hello(name : LibC::Char*) : Void
end

Say.hello("your name")

现在您只需编译您的水晶应用程序,它就可以工作了。 crystal build hello.cr

【讨论】:

  • 谢谢 @isaacsloan,这很有帮助。我很高兴能在我未来的一些项目中实现这一点。
  • 不要破坏旧线程,但谁能谈谈使用 Crystal 绑定到 C 的性能?我知道其他一些语言对 FFI 类型的东西有相当高的开销,那么 Crystal 中也存在这种情况吗?
猜你喜欢
  • 2013-10-14
  • 1970-01-01
  • 2013-03-10
  • 2012-09-10
  • 1970-01-01
  • 2017-11-18
  • 2020-03-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多