正在从 D 中的静态库加载 类
Loading Classes From Static Library in D
我从这个答案中阅读了如何从静态库加载函数:
但是我需要从静态库中加载一个class,而不只是一个函数,我该如何实现?
classes 实际上不是导出二进制文件中的东西。它们基本上只是一个花哨的结构。结构基本上只是内存与数据的布局。库大多只包含函数。
所以你真正想要做的是创建一个包含成员函数声明的 class 并在其中添加成员变量,如下所示:
library/somelib.d:
module somelib;
class Foo
{
private long member;
this(long n)
{
member = n * 2;
}
int func(int x)
{
return cast(int) (x + member);
}
}
wrapper/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
而不是指定文件名,因此模块名称可以匹配 file/folder 路径,因为 wrapper/somelib.d 的模块名称必须 匹配 library/somelib.d 的模块名称,因为这就是函数名称在 D.
中被破坏的方式
我从这个答案中阅读了如何从静态库加载函数:
但是我需要从静态库中加载一个class,而不只是一个函数,我该如何实现?
classes 实际上不是导出二进制文件中的东西。它们基本上只是一个花哨的结构。结构基本上只是内存与数据的布局。库大多只包含函数。
所以你真正想要做的是创建一个包含成员函数声明的 class 并在其中添加成员变量,如下所示:
library/somelib.d:
module somelib;
class Foo
{
private long member;
this(long n)
{
member = n * 2;
}
int func(int x)
{
return cast(int) (x + member);
}
}
wrapper/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
而不是指定文件名,因此模块名称可以匹配 file/folder 路径,因为 wrapper/somelib.d 的模块名称必须 匹配 library/somelib.d 的模块名称,因为这就是函数名称在 D.