我可以构建一个Go程序,同时静态链接一些DLL吗?

p3rjfoxz  于 2023-09-28  发布在  Go
关注(0)|答案(2)|浏览(99)

如果您在慢速硬盘上运行具有Windows DLL依赖项的Go应用程序,有时会出现Windows加载这些DLL的时间过长的情况。
如果你把你的go应用程序放到windows服务中,你会遇到严重的问题。
特别是在慢速硬盘上,这会导致windows服务超时,服务将无法启动。
有没有可能以某种方式将这些DLL静态链接到go应用程序?
加载DLL后,一切正常,但需要两次尝试才能使服务运行。
但在第一次失败后,Windows不会尝试再次启动该服务,因此我必须自己手动启动该服务。
有人有主意吗?

gzszwxb4

gzszwxb41#

简短的回答是“不”:“DLL”代表“动态链接库”,不可能静态链接DLL。
基本上你有两条路可走,我会说:

  • 调试问题。

Windows服务启动的默认超时为30000毫秒;这是 * 很多 *,所以我倾向于认为你的问题是没有加载DLL或至少没有 * 定位 * 和链接它们。
通常的做法是双管齐下:

  • 隔离可能的病例。首先,将您的服务转换为一个简单的(比如控制台)程序,并查看它如何使用冷缓存启动。如果该行为持续存在,则它将比服务更容易调试。
  • 研究一下你的一些DLL是否会做一些愚蠢的事情,比如在它们的入口点函数(俗称“DllMain”)中执行网络请求。

如果您使用LoadLibrary[Ex]加载DLL,则在这些调用时将调用其入口点。
考虑到这一点,请尝试在DLL初始化代码中添加一些跟踪。
如果所有这些都失败了,请尝试Sysinternals fame的procmon或类似的工具。

  • 获取/生成这些库的 static 构建-然后您就可以静态地链接它们了。

但请注意,如果问题实际上是处理这些库的初始化,静态链接它们不会给您带来任何好处-也就是说,它们已经链接得很慢了。
我还要指出,如果我的猜测是正确的,并且一个或多个yout lib试图访问某些网络资源,解决这个问题的一个简单方法可能是为您的服务实现适当的依赖关系-这样它就只在它所依赖的服务运行时启动(例如网络,DNS等)。

cwtwac6a

cwtwac6a2#

考虑使用LazyDll来加速代码。

相关问题