我们可以静态链接动态C库吗?

时间:2015-10-16 13:03:19

标签: c dll static-linking dynamic-library

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

2 个答案:

答案 0 :(得分:2)

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

使用VS,静态库基本上只是一个目标文件容器,也就是说,你有一个.lib文件,但.lib文件只是所有.obj的容器。编译器为项目生成的文件。

这里重要的是静态库中的.obj代码尚未经过链接阶段,没有链接器。

而DLL(最终)由链接器(来自目标文件)生成。

所以这里的问题实际上是工具链支持之一,因为DLL已经是链接器输出,我怀疑你可以让链接器将其PE代码直接重新链接到可执行文件中。

答案 1 :(得分:1)

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

在Visual Studio中,首先在项目属性的Linker-> Input中添加.lib文件。

虽然这是静态链接,但它不会将.dll代码复制到您的可执行文件中;你仍然需要.dll来运行应用程序。

此外,如果.dll是您开发的和/或拥有源代码的东西,它可以作为静态库修改/重建并链接到您的可执行文件(因此您将没有单独的.dll文件)。 / p>