C++动态库与静态库

C++静态库与动态库

库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。

静态库(.a ,.lib) 动态库(.so ,.dll) 这里的动态静态是指链接。

将程序编译成可执行程序的步骤:预编译、编译、汇编、链接。

静态库:

在链接阶段,会将汇编生成的目标文件(.o)与引用到的库一起链接打包到可执行文件中。一个静态库可以简单看成是一组目标文件(.o/.obj文件)的集合。

特点:静态库对函数库的链接是放在编译时期完成的。程序在运行时与函数库再无瓜葛,移植方便。浪费空间和资源,因为所有相关的目标文件与牵涉到的函数库被链接合成一个可执行文件。Linux下使用ar工具,Windows下使用lib.exe,将目标文件压缩在一起,并且对其进行编号和索引,以便于查找和检索。

Windows下创建和使用静态库:

创建静态库(.lib):使用vs命令行生成静态库,创建win32控制台程序时,勾选静态库类型;打开工程“属性面板”->“配置属性”->“常规”,配置类型选择静态库。

使用静态库:①在vs中使用静态库,工程“属性面板”->“通用属性”->“框架和引用”->“添加应用”,将显示添加应用对话框,项目选项卡中选择StaticLibrary。

添加StaticMath.h头文件目录,必须修改包含目录路径。打开工程属性面板->配置属性->c/c++->常规,在附加包含目录中加入StaticMath.h头文件所在目录的路径或浏览至该目录。

②打开工程属性面板->配置属性->链接器->命令行,输入静态库的完整路径即可。

③属性面板->配置属性->链接器->常规,附加依赖库目录中输入,静态库所在目录;属性面板->配置属性->链接器->输入,附加依赖库中输入静态库名StaticLibrary.lib。

动态库:

动态库在程序编译时并不会被连接到目标代码中,而是在程序运行时才被载入。不同的应用程序如果调用相同的库,那么在内存里只需要有一份该共享库的实例。动态库可以实现进程之间的资源共享,因此动态库也称为共享库。可以真正做到链接载入完全由程序员在程序代码中控制(显示调用)。

创建动态库:在Windows系统下执行文件格式是PE格式,动态库需要一个DllMain函数做出初始化的入口,通常在导出函数的声明时需要有_declspec(dllexport)关键字。

①需要一个DllMain函数做出初始化的入口。(创建win32控制台程序时勾选DLL类型会自动生成这个文件)

②导出函数的声明时需要有_declspec(dllexport)关键字。

③生成动态库需要设置工程属性,打开工程->配置属性->常规,配置类型选择动态库。

使用动态库:

①工程属性面板->通用属性->框架和引用->添加引用。在项目选项卡中选择需要用到的库。添加头文件目录,必须修改包含目录路径。打开工程属性面板->配置属性->C/C++->常规,在附加包含目录属性值中,输入头文件所在目录的路径或浏览至该目录。编译运行。

②属性面板->配置属性->链接器->常规,附加依赖库目录中输入,动态库所在的目录。属性面板->配置属性->链接器->输入,附加依赖库中输入动态库编译出来的.lib文件。


上面对于静态库动态库相当于隐式调用,下面介绍显式调用:

在Windows下显式调用动态库:调用LoadLibrary(或相似函数)以加载DLL和获取模块句柄。调用GetProcAddress以获取指向应用程序要调用的每个导出函数的函数指针。由于应用程序是通过指针调用DLL的函数,编译器不生成外部引用,故无需与导入库链接。使用完DLL后调用FreeLibrary。

C++有个特定的关键字用来声明采用C binding的函数:extern "C"。用extern "C"声明的函数将使用函数名作符号名,就像C函数一样,只有非成员函数才能被声明为extern ''C",并且不能被重载。它们可以像C函数一样被dlopen动态加载。有了extern "C"限定符后,依然是一个完全的C++函数,可以使用任何C++特性和各种类型的参数。

点击打开链接

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值