原文
我正在推动D中的共享库
支持进入更可用的状态.
方法如下:
构建-betterC
共享库,构建依赖如上共享库
的完整D可执行文件
.不管你对-betterC
的感觉如何,在此使用它的原因是,避免我在最初推送过程中遇见的druntime
问题.
我没有在Posix
上,也没在GDC
上测试过.现在我只对窗口
支持感兴趣,因为它有最多的平台相关问题,我完全忽略了Optlink
(就我而言,这是WONTFIX
).
ldc
和dmd
都可这里工作.但是这两例,你都需要手动生成ModuleInfo
块.如下所示:
export extern(C) void _D6dynlib3app12__ModuleInfoZ() {
asm {
naked;
di 0;
di 0x1000;
db 0;
}
}
LDC
和DMD
都无法配置ModuleInfo
生成.GDC
有办法可打开和关闭
它.
如果删除-betterC
,由于重复
符号(未导出),在dmd
中该块不再工作.LDC
编译正常.
在代码基
中,我发现因为假装是可见性修改器
的导出
是链接指令
,因此--fvisibility=public
是非常有用
的.(但是,忽略它,因为它是DIP
).
作为代码基
的一部分,我正在努力让dub
工作.我目前正在等待被openssl[1]
的vibe.d
回归阻止了的PR
.表明应从复制至目标目录
的依赖上构建,且不链接dll
,而是用他们的导入库
.
如果修复它,应使如下工作:
0,在LDC
和DMD
中,实现打开和关闭ModuleInfo
生成的开关
(忽略-betterC
开关).
1,在DMD
中导出ModuleInfo
.
2,在DMD
中,实现打开导出
所有符号的开关
.
最后:目前,除非使用-betterC
或按非D库
对待,DMD
不适合共享库
.对非-betterC
,ldc
是可行的.
修复错误时,发现使用MSVC
链接器时,当前会破坏
包含Unicode
符号的共享库
.
对非英语
用户来说,这是拦路虎.
必须要净化
这些符号名,使它们是ASCII
.
可惜,在测试
套件中有个不完整
的测试用例,它只覆盖了可执行文件
.
在MSVC
链接器中,LDC
也遇见的bug
(他们像我一样通过禁止
测试来解决).
喜悦,通过修复导出ModuleInfo
可关闭另一个错误报告.错误
pr这里
我再次尝试解决,在窗口
上,不导出ModuleInfo
问题.
因为它阻止D可执行
文件导入DLL
中的D模块
,这是个问题.
目前,除了如下,我已成功
导出并添加至importedModules
成员:
按ModuleInfo**[]
,而不是ModuleInfo*[]
添加.
//dmodule.d ~364
Symbol* isym; ///导入csym的版本
//toobj.d ~190,处理importedModules
import std.algorithm : canFind;
if (mod.ident.toString().canFind("second")) {
if (!mod.isym) {
mod.isym = s.toImport(mod.loc);
outdata(mod.isym);
}
s = mod.isym;
//s.Sflags |= SFLweak;
dtb.xoff(s, 0, TYnptr);
} else {
//弱引用不会从库中拉对象,如果未拉入,则解析为0.不能仅因为导入了模块,就拉入它.
s.Sflags |= SFLweak;
dtb.xoff(s, 0, TYnptr);
}
//导出:
objmod.export_symbol(m.csym, 0);
看起来简单,实际难.
注意:上面代码中,我硬编码为仅应用至"第二"
模块,来避免构建druntime
.
得到未解析错误,该错误的有趣
在,它引用了ldc
函数的DllImport
符号.在开始运行时
时有效地解引用和设置
的操作系统
链接器的顶部
做了额外修补.排除了它只是dmd
的限制,而是系统链接器
和代码生成器
级别的概念
问题.
那么这对dmd
表明什么呢?好吧,要么从ldc
复制方法,要么按需
修补.按需
修补可能最好
,但即在调用importedModules
时,在两个地方
用额外
内存分配来更改druntime
.