我们可以 link 一个静态的动态 C 库吗?

Can we link a dynamic C library statically?

我们知道,当link调用静态库时,linker将相关代码从.a文件复制到可执行二进制文件中。当 linking 动态库时,linker 只是将它在 .lib 文件(在 Windows 下)中找到的函数地址复制到二进制文件中,而函数本身并没有复制。运行时,OS加载dll,程序根据地址运行代码。问题是,我可以使用 .lib 文件和 dll 静态地 link 动态库吗? linker 从.lib 中读取地址,然后将相关代码从dll 中复制到二进制文件中。它应该工作,对吧?

如果您想要 link .dll 在构建时而不是 运行 时是的,可以使用与 .dll 对应的 .lib 文件来完成。确切的方法取决于您使用什么来构建您的应用程序。

在 Visual Studio 中,您首先在项目属性的链接器-> 输入中添加 .lib 文件。

虽然这是静态的 linking 它不会将 .dll 代码复制到您的可执行文件中;您仍然需要 .dll 才能 运行 应用程序。

此外,如果 .dll 是您开发的 and/or 具有源代码,它可以 modified/rebuild 作为静态库并 link 编辑到您的可执行文件中(这样您不会有单独的 .dll 文件)。

我不知道你的想法 是否可以 行得通,但请注意 - 在 Windows 上,至少在 Visual Studio 上 - 静态库与 DLL 非常不同。

有了VS,静态库基本上只是一个目标文件容器,也就是说,你有一个.lib文件,但是那个.lib文件只是所有[=12]的容器=] 编译器为项目生成的文件。

这里重要的是.obj静态库中的代码还没有经过linking阶段,没有linker参与了。

而 DLL(最终)由 linker(来自对象文件)生成。

所以这里的问题实际上是工具链支持之一,因为 DLL 已经是 linker 输出,我怀疑你能否让 linker 重新 link它的 PE 代码直接进入可执行文件。