Crystal C 绑定,简单的 hello world 示例。

7

我正在尝试弄清楚crystal中的c绑定是如何工作的。首先,我想知道如何将一个简单的hello world c函数包含到crystal中。从基础开始总是很好的,对吧?这是我想要包含的函数:

#include <stdio.h>

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

2
从长远来看,您可以实现一个动态链接库,例如libawesome.so(从C端看起来很复杂),然后就可以像通常的例子一样使用它:@[Link("awesome")] - Oleh Prypin
@OlehPrypin 感谢您的评论。我实际上正在研究这个问题。非常感谢。 - Jake
@Jake 最近我制作了一个小演示,展示了如何完成这个任务:https://github.com/ethagnawl/crystal-c-interop-demo 希望有所帮助! - pdoherty926
@isaacsloan 我对C语言还非常陌生,所以请把我说的话当作参考。如果有更有经验的人指正我,我会很高兴。我不确定我的方法是否一定有优势,但我相信使用ar创建静态库可以将多个目标文件捆绑在一起,并且更容易分发你的库。如果你感兴趣,这里是我在创建演示时使用的教程。(我还在存储库中添加了一些参考链接。) - pdoherty926
@pdoherty926 谢谢。 - isaacsloan
显示剩余2条评论
1个回答

15

我也花了一些时间才明白这个。首先,你需要将C文件编译成一个对象。在gcc中,你需要运行 gcc -c hello.c -o hello.o

然后,在crystal文件中,你需要链接到C对象。以下是一个示例:

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

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

Say.hello("your name")

现在,您只需要编译您的Crystal应用程序,它就可以工作了。

crystal build hello.cr

2
谢谢 @isaacsloan,这对我很有帮助。我很兴奋地想把它应用到我的一些未来项目中。 - Jake
不是为了挖掘旧帖子,但有人能谈谈使用Crystal绑定到C的性能吗?我知道其他一些语言在使用FFI类型的东西时有相当高的开销,那么这种情况在Crystal中是否也存在? - jocull

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接