Chinaunix首页 | 论坛 | 博客
  • 博客访问: 734070
  • 博文数量: 192
  • 博客积分: 2653
  • 博客等级: 少校
  • 技术积分: 1623
  • 用 户 组: 普通用户
  • 注册时间: 2012-05-31 18:25
个人简介

How tough life is, how strong you should be!

文章分类

全部博文(192)

文章存档

2015年(1)

2014年(2)

2013年(37)

2012年(152)

分类: C/C++

2012-08-21 10:50:06

静态编译:将所有的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,哪怕是静态加载的,会有两个好处:节省内存空间,因为多个模块共用它,也只有一份内存空间;代码重用。
阅读(1273) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~