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