我正在尝试在 Windows 上编译一个可以与Raku 中的NativeCall一起使用的 DLL 库。这是一个最小的 C 代码 ( my_c_dll.c):
#include <stdio.h>
#define EXPORTED __declspec(dllexport)
extern __declspec(dllexport) void foo();
void foo()
{
printf("Hello from C\n");
}
Run Code Online (Sandbox Code Playgroud)
我在 Windows 10 上安装了 Visual Studio 2019 的构建工具。要编译 DLL,我打开“VS 2019 的开发人员命令提示符”并运行:
> cl.exe /c my_c_dll.c
> link /DLL /OUT:my_c_dll.dll my_c_dll.obj
Run Code Online (Sandbox Code Playgroud)
这将创建一个 DLL my_c_dll.dll,然后我尝试从 Raku ( test-dll.raku)使用它:
use v6.d;
use NativeCall;
sub foo() is native("./my_c_dll.dll"){ * }
foo();
Run Code Online (Sandbox Code Playgroud)
但是当我运行它时(我已经安装了 Rakudo 版本 2020.05.1),我得到:
> raku test-dll.raku
Cannot locate native …Run Code Online (Sandbox Code Playgroud) 我正在编写一个使用 的库NativeCall,如果能够Hash从导出函数返回 Raku 对我来说会非常方便。我怎样才能做到这一点?
例如,在 Ruby 中,如果我想Hash从 C 返回 a,我会这样做:
#include "ruby.h"
VALUE make_hash() {
VALUE hash = rb_hash_new();
return hash;
}
Run Code Online (Sandbox Code Playgroud)
我有兴趣看看这是否可以完成,我在想也许我需要使用 MoarVM 标头或其他东西。但我不确定。
我想做的是编写一个 C 函数,它接受一个 String 来做一些事情,然后返回一个 Raku 哈希。