如何从so/dll获取模板函数?
How to get template function from so/dll?
如何从so/dll获取模板函数?
我试过了:
Library libdll;
T abc(T)();
static this()
{
libdll = Library("libs/libdll.so");
abc = cast(typeof(abc)) libdll.loadSymbol!(typeof(abc))("dll.abc");
//abc();
}
但是abc
的类型被确定为void
。
我在编译中遇到错误:
Error: expression `cast(void)dlsym(this.handle, toStringz(cast(const(char)[])m))` is `void` and has no value
m
- 是 dll.abc
的错位名称。
D 中的模板是仅编译时构造,sos/dlls 中不存在。特定实例最终出现在 so 中,但只有那些在那里使用的实例。换句话说,如果您在 so/dll:
中有此代码
module dll;
T abc(T)() {
T result = void;
return result;
}
void use() {
auto var = abc!int();
}
您应该能够从 so/dll.
中获取 dll.abc!int.abc
(损坏的名称 _D3dll__T3abcTiZQhFNaNbNiNfZi
)
如果你想用其他类型调用 abc
,比如 abc!string
,那你就不走运了——代码不存在。
这涵盖了可行性。如果您只想要一个您知道已实例化的特定实例,那么这里还有另一个问题,即 typeof(abc)
的使用。同样,abc
是编译时的东西,没有类型。令人困惑的是,编译器 returns void
for typeof(abc)
,给你错误信息 is `void` and has no value
.
abc!int
是一个函数,并且确实有一个类型 (pure nothrow @nogc @safe int()
),因此使用它应该有效。如上所述,名称将是 dll.abc!int.abc
(它是一个 eponymous template,因此是重复的名称)。
TL;DR:如果您想要模板的特定实例,并且已在 so/dll 中实例化,此代码应该有效(但尚未经过测试):
Library libdll;
T abc(T)();
static this()
{
libdll = Library("libs/libdll.so");
abc = cast(typeof(abc!int)) libdll.loadSymbol!(typeof(abc!int))("dll.abc!int.abc");
abc();
}
如何从so/dll获取模板函数? 我试过了:
Library libdll;
T abc(T)();
static this()
{
libdll = Library("libs/libdll.so");
abc = cast(typeof(abc)) libdll.loadSymbol!(typeof(abc))("dll.abc");
//abc();
}
但是abc
的类型被确定为void
。
我在编译中遇到错误:
Error: expression `cast(void)dlsym(this.handle, toStringz(cast(const(char)[])m))` is `void` and has no value
m
- 是 dll.abc
的错位名称。
D 中的模板是仅编译时构造,sos/dlls 中不存在。特定实例最终出现在 so 中,但只有那些在那里使用的实例。换句话说,如果您在 so/dll:
中有此代码module dll;
T abc(T)() {
T result = void;
return result;
}
void use() {
auto var = abc!int();
}
您应该能够从 so/dll.
中获取dll.abc!int.abc
(损坏的名称 _D3dll__T3abcTiZQhFNaNbNiNfZi
)
如果你想用其他类型调用 abc
,比如 abc!string
,那你就不走运了——代码不存在。
这涵盖了可行性。如果您只想要一个您知道已实例化的特定实例,那么这里还有另一个问题,即 typeof(abc)
的使用。同样,abc
是编译时的东西,没有类型。令人困惑的是,编译器 returns void
for typeof(abc)
,给你错误信息 is `void` and has no value
.
abc!int
是一个函数,并且确实有一个类型 (pure nothrow @nogc @safe int()
),因此使用它应该有效。如上所述,名称将是 dll.abc!int.abc
(它是一个 eponymous template,因此是重复的名称)。
TL;DR:如果您想要模板的特定实例,并且已在 so/dll 中实例化,此代码应该有效(但尚未经过测试):
Library libdll;
T abc(T)();
static this()
{
libdll = Library("libs/libdll.so");
abc = cast(typeof(abc!int)) libdll.loadSymbol!(typeof(abc!int))("dll.abc!int.abc");
abc();
}