在 Myrddin 中调用 C 函数
Myrddin 的实现是兼容 C ABI 的(见 https://myrlang.org/ C Binding 一节),我就试一下调用 C 的函数。
我写个 Myrddin 源程序 hello.myr:
use std extern const greet: (->void) extern const sqrtf: (x:flt32 -> flt32) extern const memset: (buf: void#, c: int, sz: uint64 -> void) const main = { var buf: int[64] greet() std.put("Myrddin std.put\n") std.put("sqrt(9) is {}\n", sqrtf(9.0)) memset((&buf: void#), 0x55, 64*4) for var i = 0; i < 64; i++ std.put("{} ", buf[i]) ;; std.put("\n") }
Myrddin 有 void# (即 C 里面的 void*),但是没有隐式类型转换,所以要显式地将 buf 转为 void#. 此外,我暂时还不知道 Myrddin 里面有没有 sizeof, 所以直接把数组的大小 64*4 写进 memset 的参数里面。
greet() 是我自己定义的函数,在 greet.c 里面:
#include <stdio.h> void greet() { puts("Hello world!"); }
首先把目标文件 *.o 编译出来:
gcc -c greet.c 6m hello.myr
最后手动链接,我们用 Myrddin 的运行时,和 C 的 libc 和 libm:
ld -o hello hello.o greet.o /usr/local/lib/myr/libstd.a /usr/local/lib/myr/libsys.a /usr/local/lib/myr/_myrrt.o -lc -lm -dynamic-linker /usr/lib64/ld-linux-x86-64.so.2
注意 -dynamic-linker 参数,否则链接出来的程序不能运行。
最后运行 hello, 正常输出结果。