我从这个答案中了解了如何从静态库加载函数:https://stackoverflow.com/a/10366323/6123767
但是我需要从静态库中加载一个类,而不仅仅是一个函数,我该如何实现呢?
答案 0 :(得分:3)
类实际上并不是导出二进制文件中的东西。它们基本上只是一个奇特的结构。结构基本上只是具有数据的内存布局。图书馆通常只包含功能。
所以你真正想要做的是创建一个包含成员函数声明的类,并在其中添加成员变量,如下所示:
库/ somelib.d:
module somelib;
class Foo
{
private long member;
this(long n)
{
member = n * 2;
}
int func(int x)
{
return cast(int) (x + member);
}
}
包装/ somelib.d:
module somelib; // module names need to match!
class Foo
{
private long member;
this(long n);
int func(int x);
}
app.d:
module app;
import std.stdio;
import somelib;
void main()
{
Foo foo = new Foo(4);
writeln("foo: ", foo);
writeln("func: ", foo.func(5));
}
使用dmd -lib library/somelib.d -ofsomelib.a
(或Windows上的.lib)编译库
使用dmd app.d -Iwrapper somelib.a -ofapp
(或Windows上的.lib / .exe)编译可执行文件
我做-Iwrapper
而不是指定文件名,因此模块名称可以匹配文件/文件夹路径,因为wrapper / somelib.d 的模块名称必须匹配库的模块名称/somelib.d因为这就是D中函数名称的损坏。