• 【C++】静态库动态库


    也叫做静态链接库和动态链接库

    库:写好功能的函数。都是exe文件。

    程序安装完之后,会出现.dll和.lib文件。

    程序运行中,可能需要调用的库。

    将一个程序编译成可执行程序的步骤:预处理、编译、汇编、链接、可执行文件

    库是写好的,例如cout、createthread等库函数。仅调用即可。

    理解:库就是可执行的二进制文件。

    静态库:.a/.lib

    动态库:.so/.dll

    分别是Linux和windows下的后缀。

    区别

    区别在于,在链接阶段,如何处理链接成可执行程序。

    静态库:

    1. 编译时期完成的链接
    2. 程序运行过程中,与库无关系,移植方便(优点)
    3. 浪费空间和资源,更新复杂(缺点)

    动态库每次执行都要链接

    静态库只链接一次,嵌入exe中,将目标文件压缩到一起,对其编号和索引进程

    先生成exe,而后是lib。无数个.o合体成为新的。o就是汇编文件。

    静态链接库

    把所有的.o文件合成lib

    若静态库更新,则需重新生成一个exe,更新复杂。

    静态库特点:

    1、空间浪费

    2、更新复杂,需要重新下载

    静态库对程序的更新、部署和发布页会带来麻烦

    如果今天静态库更新了,所有使用它的应用程序都需要重新编译,再发给用户。

    为了解决此缺点,提出了动态库

    动态链接库

    仅此一份,程序执行时才会链接这个库,动态库更新,仅更新dll即可放回之前的位置。

    静态库步骤

    1. //静态库头文件mylib.h
    2. #pragma once
    3. #include
    4. using namespace std;
    5. int add(int a, int b);
    6. int sub(int a, int b);
    7. //静态库cpp文件mylib.cpp
    8. #include"mylib.h"
    9. int add(int a, int b) {
    10. return a + b;
    11. }
    12. int sub(int a, int b) {
    13. return a - b;
    14. }

    将mylib.h和上一级Debug里的mylib.lib文件提取出来,放入新的lib目录中,与主函数cpp文件同目录下。

    1. //主函数
    2. #include"./lib/mylib.h"
    3. #pragma comment(lib,"./lib/mylib.lib")
    4. int main() {
    5. cout << add(2, 3) << endl;
    6. cout << sub(6, 5) << endl;
    7. system("pause");
    8. return 0;
    9. }

    动态库步骤

    1. //动态库头文件mydll.h
    2. #pragma once
    3. #include
    4. using namespace std;
    5. _declspec(dllexport) int mlt(int a, int b);
    6. //动态库cpp文件mydll.cpp
    7. #include"mydll.h"
    8. int mlt(int a, int b) {
    9. return a * b;
    10. }

    将mydll.h和Debug下的lib和dll文件拿走,h和lib放入cpp目录中的dll目录,而dll必须放入exe相同的目录下。

    1. #include"./dll/mydll.h"
    2. #pragma comment(lib,"./dll/mydll.lib")
    3. int main() {
    4. cout << mlt(3, 5) << endl;
    5. system("pause");
    6. return 0;
    7. }
  • 相关阅读:
    使用Python,Keras和TensorFlow训练第一个CNN
    从 算力云 零开始部署ChatGLM2-6B 教程
    uniapp 地图行车轨迹
    scss的高级用法——循环
    【数据结构】&&【C++】封装红黑树模拟实现map和set容器
    大数据培训技术Phoenix和Hbase表的关系
    移动应用买量越来越难,APP增长的新机遇在哪里?
    systemd 强大的初始化系统和服务管理器
    推荐一个 Web 端自动化神器 - Automa
    06 MyBatis缓存
  • 原文地址:https://blog.csdn.net/callmejielun/article/details/126384231