windows - 我可以在构建 Go 程序的同时静态链接一些 DLL 吗?

标签 windows go dll dllimport static-linking

如果您在慢速硬盘上运行带有 Windows DLL 依赖项的 go 应用程序,有时会发生 Windows 加载这些 dll 的时间过长。

如果您将 go 应用程序放入 Windows 服务中,您会遇到严重的问题。

特别是在慢速硬盘上,这会导致 windows 服务超时,服务无法启动。

是否有可能以某种方式将这些 DLL 静态链接到 go 应用程序?

加载 DLL 后一切正常,但需要两次尝试才能使服务运行。

但是在第一次失败后,Windows不会再尝试启动该服务,所以我只好自己手动启动该服务。

有人有想法吗?

最佳答案

简短的回答是“否”:“DLL”代表“动态链接库”,静态链接 DLL 是不可能的。

基本上你有两条路可以走,我会说:

  • 调试问题。

    Windows 服务启动的默认超时时间 为 30000 毫秒;那是很多,所以我倾向于认为 你的问题是它没有加载 DLL 或者至少没有加载 定位并将它们链接起来。

    通常的方法是双管齐下:

    • 隔离可能的案例。首先,将您的服务变成 一个简单的(比如控制台)程序,看看它是如何启动的 与冷缓存。如果行为持续存在,它会更简单 比服务调试。

    • 研究您的某些 DLL 是否做了愚蠢的事情 比如在它们的入口函数中执行网络请求 (俗称“DllMain”)。

      如果您使用 LoadLibrary[Ex] 加载 DLL, 它们的入口点在这些调用中被调用。

      考虑到这一点,尝试在您的 DLL初始化代码。

    如果所有这些都失败了,试试 Sysinternals 的 procmon 或类似工具。

  • 获取/生成这些库的静态构建——然后您将 能够静态链接它们。

    但请注意,如果这个问题实际上是有事情要处理的 通过这些库的初始化,静态链接它们 不会给你买任何东西——也就是说,它们已经链接起来很慢。


我还会注意到,如果我在黑暗中拍摄的照片是正确的, 并且一个或多个你的库试图访问一些网络 资源,解决问题的一个简单方法可能是实现 为您的服务提供适当的依赖关系——以便它只启动 当它所依赖的服务正常运行时(例如 网络、DNS 等)。

关于windows - 我可以在构建 Go 程序的同时静态链接一些 DLL 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51855473/

相关文章:

c++ - 在 Python 中创建 C++ 类的实例并在其上调用方法

windows - 自动 DPC 延迟测试 - 如何?

c# - 禁用 MSI 还原点创建

c++ - C++ 中的 DLL 导出和继承

mongodb - 使用 Golang mgo : Persistent no reachable server to replica set 连接到 MongoDB Atlas

json - 如果 json bytes 字段与某种类型匹配,我如何仅解码到字段中?

java - 签名的 Applet、JNI 和 DLL

c# - WTSQuerySessionInformation 返回不同的域名

windows - SVN比较两个文件夹并在命令提示符中导出差异

ajax - 使用 ajax 的网络抓取工具/爬虫