使用静态构造函数链接dll时,如何解析未解析的外部符号?

时间:2019-03-24 21:17:40

标签: dll linker d unresolved-external

我正在使用一些实用程序,工具等在D中构建一个dll。我可以成功编译一个基本的dll,并测试程序以在Visual D中使用它,而不会出现任何问题。我熟悉创建和使用dll的过程。尤其是针对他们的静态链接。但是,如果dll中的模块具有静态的this(),或导入具有静态的this()的模块,则该dll将进行编译,但是使用该模块构建的任何程序都将失败,并且无法解析foo.bar .__ ModuleInfo。

错误LNK2001:无法解决的外部符号“ dtoolbox.dtoolboxdllmain .__ ModuleInfo”(__D8dtoolbox15dtoolboxdllmain12__ModuleInfoZ)

在这种情况下,我的dllmain模块dtoolbox.dtoolboxdllmain导入了core.runtime,它具有静态的this(),因此我得到此错误。我该如何解决?静态模块构造函数正在做什么导致这种情况?只要没有静态构造函数,一切都可以正常工作。

[edit]导入core.runtime并不是问题,这是模块拥有静态的this(),而不是core.runtime的静态this()。

1 个答案:

答案 0 :(得分:2)

解决方案是避免将带有dll的static this()和&〜〜static(this)的模块导入使用dll的程序的模块中。 (在这种情况下,dllmain模块已被导入,完全没有原因,这是我的错误)并不是说dll不能包含它们,它们只是在编译dll时存在于某个文件中。我发现将它们写在与dllmain相同的模块中很方便,因为使用该dll的程序永远不需要引用/导入该文件。