从D中的静态库加载类

时间:2016-04-16 04:50:37

标签: class static-libraries d static-linking

我从这个答案中了解了如何从静态库加载函数:https://stackoverflow.com/a/10366323/6123767

但是我需要从静态库中加载一个类,而不仅仅是一个函数,我该如何实现呢?

1 个答案:

答案 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中函数名称的损坏。