C++动态链接库和静态链接库

库是一些最常用的、成熟的、可复用的代码,库代码编译成目标文件后打包存放。
静态 .lib/.a
动态 .dll/.so
System32动态链接库
为什么需要链接库?
1.底层 2.保护代码
CRT C运行时库
VC++提供的CRT
静态运行时库
libc.lib 或者libcd.lib 单线程
libcmt.lib或者libcmtd.lib 多线程
动态运行时库
msvcrt.dll msvcrtd.dll 多线程
Standard C++ Library C标准库+IO流+STL
libcp.lib libcpd.lib
libcpmt.lib libcpmtd.lib
msvcprt.dll
什么是静态链接库
编译集成可执行文件中
发布只需要exe,exe较大,升级库必须重新编译
使用静态库的步骤
1.包含头文件
2.配置lib文件
#pragma comment(lib,"…/a.lib")或者连接器输入附加依赖项
只做第一步无法解析的外部命令
静态库发布的时候不需要.lib文件 因为已经集成到.exe文件

C++中的动态链接库(DLL)静态链接库(LIB)是两种不同的代码复用机制,它们在编译运行时有着显著的区别不同的调用方式。 ### 静态链接库(LIB) 静态链接库在编译时将库代码直接嵌入到可执行文件中。其特点如下: 1. **编译时绑定**:库代码在编译时被复制到可执行文件中。 2. **独立性**:生成的可执行文件包含所有需要的代码,不依赖于外部库文件。 3. **文件大小**:生成的可执行文件较大,因为包含了库代码。 4. **更新困难**:如果库代码需要更新,必须重新编译发布整个可执行文件。 **调用方式**: 1. 在代码中包含头文件。 2. 在编译时链接静态库文件(.lib)。 ```cpp // example.h #ifndef EXAMPLE_H #define EXAMPLE_H void exampleFunction(); #endif // EXAMPLE_H ``` ```cpp // example.cpp #include "example.h" void exampleFunction() { // 函数实现 } ``` ```cpp // main.cpp #include "example.h" int main() { exampleFunction(); return 0; } ``` 编译命令: ```sh g++ -c example.cpp -o example.o ar rcs libexample.a example.o g++ main.cpp -L. -lexample -o main ``` ### 动态链接库(DLL) 动态链接库在运行时加载库代码,程序在运行时动态链接到库文件。其特点如下: 1. **运行时绑定**:库代码在程序运行时被加载。 2. **依赖性**:生成的可执行文件依赖于外部库文件。 3. **文件大小**:生成的可执行文件较小,因为不包含库代码。 4. **易于更新**:只需替换库文件即可更新代码,无需重新编译可执行文件。 **调用方式**: 1. 在代码中包含头文件。 2. 在编译时链接导入库文件(.lib)或使用显式加载。 3. 在运行时确保DLL文件可用。 ```cpp // example.h #ifndef EXAMPLE_H #define EXAMPLE_H #ifdef EXAMPLE_EXPORTS #define EXAMPLE_API __declspec(dllexport) #else #define EXAMPLE_API __declspec(dllimport) #endif extern "C" EXAMPLE_API void exampleFunction(); #endif // EXAMPLE_H ``` ```cpp // example.cpp #include "example.h" void exampleFunction() { // 函数实现 } ``` ```cpp // main.cpp #include "example.h" int main() { exampleFunction(); return 0; } ``` 编译命令: ```sh cl /EHsc /LD example.cpp -Feexample.dll g++ main.cpp -L. -lexample -o main ``` ### 总结 - **静态链接库**:编译时绑定,生成的可执行文件较大,更新困难。 - **动态链接库**:运行时绑定,生成的可执行文件较小,易于更新。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值