登录
首页 >  Golang >  Go问答

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

来源:stackoverflow

时间:2024-04-13 17:36:33 103浏览 收藏

Golang小白一枚,正在不断学习积累知识,现将学习到的知识记录一下,也是将我的所得分享给大家!而今天这篇文章《我可以在构建 Go 程序的同时静态链接一些 DLL 吗?》带大家来了解一下##content_title##,希望对大家的知识积累有所帮助,从而弥补自己的不足,助力实战开发!


问题内容

如果您在慢速硬盘上运行具有 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 或类似的工具。

  • 获取/生成这些库的静态版本 - 然后您将 能够静态链接它们。

    但请注意,如果问题确实需要解决 通过这些库的初始化,静态链接它们 不会给你买任何东西——也就是说,它们已经链接起来会很慢。

我还要指出,如果我在黑暗中的拍摄是正确的, 并且一个或多个 yout 库尝试访问某些网络 资源,解决问题的一个简单方法可能是实施 您的服务的正确依赖关系,以便它仅启动 当它所依赖的服务启动时(例如 网络、DNS 等)。

终于介绍完啦!小伙伴们,这篇关于《我可以在构建 Go 程序的同时静态链接一些 DLL 吗?》的介绍应该让你收获多多了吧!欢迎大家收藏或分享给更多需要学习的朋友吧~golang学习网公众号也会发布Golang相关知识,快来关注吧!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>