您的位置:首页 > 其它

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

2011-12-07 10:53 267 查看
静态编译:将所有的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);

隐式链接有时称为静态加载或加载时动态链接。显式链接有时称为动态加载或运行时动态链接。

静态库只能静态链接,而动态库可以静态链接也可以动态链接。动态链接又分为两种。即加载时动态链接和运行时动态链接。

转自:http://hi.baidu.com/huangmeiyu11/blog/item/db6514de1039630e6227985a.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: