12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849 |
- 在 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, 正常输出结果。
|