1.静态链接库和动态链接库的优缺点:
答:在仓库的发展历史上,经历了“无库-静态链接库-动态链接库”的状态:
------静态链接库和动态链接库都是通过共享代码的方式,如果采用静态链接库,无论愿不愿意,库中指令都会被包含在最后的可执行文件中,这样做的缺点多个程序中使用的资源和函数都要被重复链接到可执行文件中,使程序变大,占用内存多;
------如果采用动态链接库,只有需要使用动态链接库中的函数或资源的程序启动时,系统才会将动态链接库映射到进程的虚拟地址空间,动态链接库的使用计数增加,然后当实际使用到动态链接库时才将动态链接库载入内存;如果使用该动态链接库的程序都已结束,则将动态链接库移出内存。---使用同一动态链接库的所有程序都共享代码,但是对于动态链接库中的数据,则各有一份拷贝。---动态链接库有两种函数,输出函数和内部函数,输出函数可以被其它模块调用,内部函数只可以被动态链接库本身调用。--动态链接库也可以输出数据,但这些数据只可以被它自己的函数调用。--动态链接库文件和可执行文件相互独立,只要输出接口不变,更换动态链接库文件不会对可执行文件造成任何影响,因而极大地提高了可维护性和可扩展性。
静态链接库和动态链接库的相同点:
(1)共享代码
(2)代码封装
静态链接库和动态链接库的不同点:
(1)静态链接库包含在宿主程序中,动态链接库需要在程序运行时动态装载和卸载;
(2)静态链接库里面不可以再包含静态链接库或动态链接库,而动态链接库中可以包含其他的静态或动态链接库。
静态链接库在VS中的用法:
(1)extern "C" int sum(int x,int y)
(2)将“staticlib.h”和“staticlib.lib”加入根目录中
(3)#include "staticlib.h"
(4)#pragma comment(lib,"staticlib.lib")
动态链接库的动态调用在VS中的用法:
(1)extern "C" _declspec(dllexport) int sum(int x,int y)
(2)将“dynamiclib.h”和“dynamiclib.dll”加入根目录中
(3)#include “dynamiclib.h”
(4)
#include <windows.h>
void main(){
HINSTANCE hDll=NULL;//step 1.1:定义DLL模块的句柄
typedef int(*PSUM)(int a,int b);//step1.2:定义DLL模块中需要调用函数的指针
PSUM pSum;
hDll=LoadLibrary(L"dynamic.dll");//step 2:取得需要的DLL模块句柄
pSum=(PSUM)GetProcAddress(hDll,"sum");//step 3:取得需要的函数地址
printf("%d\n",pSum(1,2));//step 4:调用函数
system("pause");
FreeLibraray(hDll);//step 5:在内存中卸载DLL模块
return 0;
}
静态链接库的静态调用在VS 中的用法(FlashDBSim的用法):
(1)extern "C" _declspec(dllexport) int sum(int x,int y)
(2)设置项目-->属性-->常规, 这里,将配置类型从动态库(.dll)改为静态库(.lib)即可
(3)将“dynamiclib.h”和“dynamiclib.lib”和“dynamiclib.dll”加入根目录中
(4)#include "dynamiclib.h",设置项目-->属性-->链接器-->输入, 在其中的附加依赖项属性中,填入dynamiclib.lib
(5)
#pragma comment(lib,"路径和文件名")
extern "C" 函数返回类型 _declspec(dllimport) 函数名(参数表)分号
int main()
{
..............
}
此外,题解如下:
静态编译与动态编译的区别
动态编译的可执行文件需要附带一个的动态链接库,在执行时,需要调用其对应动态链接库中的命令。所以其优点一方面是缩小了执行文件本身的体积,另一方面是加快了编译速度,节省了系统资源。缺点一是哪怕是很简单的程序,只用到了链接库中的一两条命令,也需要附带一个相对庞大的链接库;二是如果其他计算机上没有安装对应的运行库,则用动态编译的可执行文件就不能运行。
静态编译就是编译器在编译可执行文件的时候,将可执行文件需要调用的对应动态链接库(.so)中的部分(???)提取出来,链接到可执行文件中去,使可执行文件在运行的时候不依赖于动态链接库。所以其优缺点与动态编译的可执行文件正好互补。优点一方面是只将需要调用的动态链接库的部门提取出来,不需要附带庞大的链接库;另一方面是不需要再计算机上安装对应的运行库。缺点一是可执行文件过大,占用内存多,另一方面是降低了编译速度。