动态链接和静态链接
2013-03-31 12:11
232 查看
本文转自:http://blog.csdn.net/xiaoyangger/article/details/5489875
理解静态链接和动态链接 前些日子在论坛上看到这样两个问题:
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()'
};
int main(int argc, char *argv[]) {
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啦
理解静态链接和动态链接 前些日子在论坛上看到这样两个问题:
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()'
};
int main(int argc, char *argv[]) {
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啦
相关文章推荐
- 动态链接和静态链接的区别
- GCC编译时会先查动态链接再查静态链接
- Linux 动态链接和静态链接简析(库名与库文件名)
- 动态链接和静态链接的区别
- 动态链接及静态链接
- 静态库 动态库 静态链接 动态链接 编译器cl.exe 链接器link.exe
- 动态链接DLL与静态链接LIB
- 静态链接和动态链接
- 动态链接与静态链接
- 动态链接和静态链接
- 提高google排名之:将动态网页链接转换成静态链接
- linux下动态链接和静态链接
- 定制动态链接和静态链接
- 动态链接与静态链接的区别
- 编译有哪些阶段,动态链接和静态链接的区别 c++
- 动态链接和静态链接的区别
- 静态链接与动态链接的区别
- CodeBlocks静态链接与动态链接设置
- ATL 静态链接 动态链接 出错处理
- C++函数动态链接库及静态链接