静态编译动态编译;静态链接动态链接;静态库和动态库
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
动态编译:编译的结果为,主程序是主程序,各个模块是各个模块。
其中静态编译和动态编译是可以设置工程属性动态设置的!
静态链接:静态链接已经把库中的函数写入到可执行文件内部了。也即静态链接把需要的库函数放进了你的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
相关文章推荐
- 静态编译动态编译;静态链接动态链接;静态库和动态库
- 静态编译动态编译;静态链接动态链接;静态库和动态库
- 静态链接与动态链接的区别 与 动态库与静态库的区别
- 静态库链接、动态库静态链接和动态链接
- “为了能够访问动态链接库中的位图资源,在编译动态链接库时,需要使用MFC静态库”
- g++ 编译链接C++代码, 生成与使用静态库和动态库
- Symbian DLL,Lib(动态加载动态库,静态加载动态库,静态加载静态库)
- VS2015编译32位Opencv310(动态库+静态库,文末有下载链接)
- linux 动态库和静态库编译链接方法
- Makefile 编译动态库文件及链接动态库
- gcc编译生成静态及动态链接库步骤
- gcc 编译链接生成sqlite动态库和静态库
- gcc编译生成静态及动态链接库步骤
- gcc编译生成静态及动态链接库步骤
- 编译链接的时候 有动态库和静态库 怎么指定她连静态库来着[不要连动态库]
- MinGW编译Qt较好的一些文章链接(静态或动态)
- gcc编译生成静态及动态链接库步骤
- vc.net中MFC静态与动态链接问题与release方式编译
- 自己在linux上编译、链接、动态库和静态库的学习笔记
- 自己在linux上编译、链接、动态库和静态库的学习笔记