使用静态构造函数链接 dll 时如何解析未解析的外部符号?
How to resolve unresolved external symbol when linking against dll with static constructors?
我正在使用一些实用程序、工具等在 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() 所以我得到了这个错误。我该如何解决这个问题?静态模块构造函数做了什么导致这个?只要没有静态构造函数,一切正常。
[编辑] 导入 core.runtime 不是问题,问题在于模块自己的静态 this(),而不是 core.runtime 的静态 this()。
解决方案是避免将带有 dll 的静态 this() && static ~this() 的模块导入到使用该 dll 的程序的模块中。 (在这种情况下,dllmain 模块被导入,完全没有任何原因,我的错误)并不是说 dll 不能有它们,它们只需要在编译 dll 时存在于某个文件中。我发现将它们写在与 dllmain 相同的模块中很方便,因为这个文件永远不需要由使用 dll 的程序referenced/imported。
我正在使用一些实用程序、工具等在 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() 所以我得到了这个错误。我该如何解决这个问题?静态模块构造函数做了什么导致这个?只要没有静态构造函数,一切正常。
[编辑] 导入 core.runtime 不是问题,问题在于模块自己的静态 this(),而不是 core.runtime 的静态 this()。
解决方案是避免将带有 dll 的静态 this() && static ~this() 的模块导入到使用该 dll 的程序的模块中。 (在这种情况下,dllmain 模块被导入,完全没有任何原因,我的错误)并不是说 dll 不能有它们,它们只需要在编译 dll 时存在于某个文件中。我发现将它们写在与 dllmain 相同的模块中很方便,因为这个文件永远不需要由使用 dll 的程序referenced/imported。