理解静态链接和动态链接 前些日子在论坛上看到这样两个问题:
1、什么叫静态链接和动态链接?(static linking,dynamic linking)
2、如何理解先期和迟后联编?(early binding,later binding)
3、连接时所需的库lib和dll。
实际上,这两个问题性质是一样的,不管是静态链接/动态链接也好,还是先期联编/迟后联编也好,都是描述了何时确定应用程序所调用函数的入口地址,如果编译器在编译时或链接时确定了所有函数的入口地址,那么这种确定地址的方法称为静态链接或者先期联编。如果是在运行时确定所有函数的入口地址,那么这种确定地址的方法称为动态链接或者迟后联编。C++通过使用虚拟函数支持动态链接/迟后联编(也叫做动态联编),它们发生在运行时刻,这样一来,使用多重继承的程序便会有更大的灵活性。
下面我们用一段代码来加以说明:
class A {
public: A();
int memberFunc();
virtual int virtualFunc();
static int staticFunc()' } main() { A* pa; // ... - initializing pa pa->memberFunc(); pa->vitrualFunt(); pa->staticFunc(); }
当编译这段代码时,编译器在编译期间可以知道确切的函数信息,比如函数署名叫:“memberFunc”、“staticFunc”等----此即为静态链接/先期联编。但是在调用virtualFunc函数时,只能在运行时得知该函数的信息,此时函数才会被真正调用,因为代码可能是下面这样的: class B : public A { public //... virtual int virtualFunc(); } 并且如果 'pa' 被赋值 pa = new B(); 那么类B的函数将会被调用并执行----此即为动态链接/迟后联编。
对于连接所需的库:
简单地讲:
第一:.DLL是动态链接库,而.LIB是静态链接库
dll是个编译好的程序,调用时可以直接调用其中的函数,不参加工程的编译. 而lib应该说是一个程序集, 只是把一些相应的函数总结在一起, 如果调用lib中的函数,在工程编译时,这些调用的函数都将参加编译.
第二:从内存管理的角度来看,lib必须被链接到主程序中,主程序进入内存,lib也同时进入内存。而dll则是需要用到它的时候由操作系统调入内存。从复用性的角度来看,lib因为必须参加编译,所以复用性就不如DLL啦