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

静态编译:将所有的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);
隐式链接有时称为静态加载或加载时动态链接。显式链接有时称为动态加载或运行时动态链接。
静态库只能静态链接,而动态库可以静态链接也可以动态链接。动态链接又分为两种。即加载时动态链接和运行时动态链接。

你可能感兴趣的:(windows,function,dll,exe,callback,library)