静态编译动态编译;静态链接动态链接;静态库和动态库

来源:互联网 发布:彩票php源代码 编辑:程序博客网 时间:2024/05/22 08:27

转自:http://blog.sina.com.cn/s/blog_57a829dd0100kig2.html


静态编译:将所有的dll和主程序都编译到一个主程序里面。
动态编译:编译的结果为,主程序是主程序,各个模块是各个模块。
其中静态编译和动态编译是可以设置工程属性动态设置的!
静态链接:静态链接已经把函数的定位信息写入到可执行文件内部了。静态连接就是把需要的库函数放进你的exe之中。所以静态编译必然通过静态链接来实现。
动态链接:动态链接就是要动态的链接,运行时候动态的链接dll。所以动态编译必然通过动态链接来实现。
静态库:静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库。所 以要静态加载的程序,也就是静态库,是lib后缀名的文件(在windows系统中)。你可以在VS2005中new一个的为win32 project 工程,选择static library,完成后编译会生成一个.lib文件(例如:生成的是MY.lib)。那么接下来如何引用这个静态库呢?
a、在工程中加入静态库,有两种方法:                                             
方法一:项目设置中引用.lib,project-setting-link-object/library modules中添加.lib;(需要在tools/options设置正确的引用路径)                               
方法二:在项目中直接加入lib,project-add to project-files,选择正确的.lib。                      
b、在工程中包括.h文件;(可能 需要在tools/options设置正确?                           
c、在工程中使用静态库中的函数; 
动态库:动态库在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入,因此在程序运行时还需要动态库存在。所以要动态加载的程序,也就是动态库。一般来说,生成动态库的时候,会有两个文件,一个导入库lib文件,一个dll。导入库是主程序动态编译时候用的,dll是主程序运行时动态加载时候用的。
静态库与导入库的区别(虽然都是lib文件):
他们实质是不一样的东西。静态库本身就包含了实际执行代码、符号表等等,而对于导入库而言,其实际的执行代码位于动态库中,导入库只包含了地址符号表等,确保程序找到对应函数的一些基本地址信息。
动态库有两种调用方式:
a:显示链接:同使用静态库相似,分为三步:引用.lib,包含头文件,使用导出函数。dll出错,那么主进程崩溃。
b:隐式链接:直接使用LoadLibrary 加载所需的动态库,然后指定所需的导出函数,效率最高!一般用在配置文件里配置了加载哪种dll的情况。dll出错,那么主进程并不会崩溃。
typedef UINT (CALLBACK* LPFNDLLFUNC1)(DWORD,UINT);
HINSTANCE hDLL;               // Handle to DLL
LPFNDLLFUNC1 lpfnDllFunc1;    // Function pointer
hDLL = LoadLibrary("MyDLL");
if (hDLL != NULL)
{
   lpfnDllFunc1 = (LPFNDLLFUNC1)GetProcAddress(hDLL,
                                           "DLLFunc1");
}
FreeLibrary(hDll);
隐式链接有时称为静态加载或加载时动态链接。显式链接有时称为动态加载或运行时动态链接。
静态库不存在什么加载方式,因为它运行时候不存在,只有exe主程序。DLL才有静态加载和动态加载的区别。
静态加载:加载时动态链接。此种加载的编程方式和静态库的编程方式相同,所以完全用静态加载的编程,该工程可以调为静态编译(个人揣测,还没做过实验)。
动态加载:运行时动态链接。
至于加载时动态链接和运行时动态链接在加载时机上有啥区别,这我还真不知道。需要继续探索。现在我认为:加载的时机和静态库的加载估计没区别,但是你如果是dll,哪怕是静态加载的,会有两个好处:节省内存空间,因为多个模块共用它,也只有一份内存空间;代码重用。

原创粉丝点击