基础知识|C/C++|#静态库与动态库#

一、静态库与动态库的差别

  1. 链接时间

    • 静态库:在编译时将库中的代码和数据嵌入到最终的可执行文件中。
    • 动态库:在运行时由动态链接器加载。
  2. 可执行文件大小

    • 静态库:可执行文件较大,因为它包含了库中的代码和数据。
    • 动态库:可执行文件较小,因为库中的代码和数据在运行时才加载。
  3. 更新

    • 静态库:一旦链接完成,除非重新编译整个程序,否则无法更新库。
    • 动态库:可以在不重新编译程序的情况下更新库。
  4. 内存占用

    • 静态库:每个使用相同库的进程都会有自己的代码副本。
    • 动态库:多个进程可以共享同一份库的内存映像。
  5. 兼容性

    • 静态库:通常具有更好的向后兼容性,因为库的代码是在编译时就确定的。
    • 动态库:可能需要管理多个版本的库,以确保与旧版本的程序兼容。

总结

  • 静态库 适合于不需要频繁更新的库,并且可以接受较大的可执行文件大小。
  • 动态库 适合于需要频繁更新的库,并且可以减少最终可执行文件的大小。

二、动态库的使用举例

1.常见动态库

  • Qt - 一个跨平台的C++ GUI库,广泛应用于桌面应用开发,通常作为动态库使用。

  • libcurl - 用于处理URLs,例如HTTP请求,通常作为动态库使用。

  • FFmpeg - 一个强大的多媒体框架,用于音频和视频处理,通常作为动态库使用。

2.创建动态库 libexample.so

(1)编写源文件 (example.c):

int add(int a, int b) {
    return a + b;
}

(2)编译并创建动态库

gcc -c example.c -o example.o
gcc -shared -o libexample.so example.o
3.在C++程序中使用动态库

(1)编写C++程序 (main.cpp):

#include <iostream>
#include "example.h"  // 假设example.h定义了add函数

int main() {
    int result = add(3, 4);
    std::cout << "Result: " << result << std::endl;
    return 0;
}

(2)编译C++程序

g++ main.cpp -L/path/to/library -lexample -o myprogram

(3)运行程序

export LD_LIBRARY_PATH=/path/to/library:$LD_LIBRARY_PATH
./myprogram

这样,您就可以看到输出的结果为 Result: 7

三、静态库的使用举例

1.常用静态库

  1. Boost - Boost是一个非常流行的C++库集合,提供了大量的工具和功能,比如容器、算法、线程支持等。Boost通常以静态库的形式被使用。

  2. OpenSSL - 用于加密和安全协议处理,例如TLS/SSL,通常也作为静态库使用。

  3. SQLite - 一个轻量级的数据库引擎,常用于嵌入式系统和桌面应用中。

2.示例如何使用静态库

步骤 1: 创建源代码文件

假设我们有两个源代码文件:addition.csubtraction.c

addition.c
#include <stdio.h>

int add(int a, int b) {
    return a + b;
}
subtraction.c
#include <stdio.h>

int subtract(int a, int b) {
   return a - b;
}

步骤 2: 编译源代码文件

使用 GCC 编译器将源代码文件编译为对象文件。

gcc -c addition.c -o addition.o
gcc -c subtraction.c -o subtraction.o

步骤 3: 创建静态库

使用 ar 工具将对象文件打包成静态库。

ar rcs libmath.a addition.o subtraction.o

这里 -r 表示替换已存在的文件,-c 表示创建,-s 表示写入符号表。

步骤 4: 创建 C++ 程序并使用静态库

接下来,我们创建一个简单的 C++ 程序来使用这个静态库。

main.cpp
#include <iostream>

extern "C" {
    int add(int a, int b);
    int subtract(int a, int b);
}

int main() {
    int sum = add(3, 4);
    int diff = subtract(10, 5);

    std::cout << "Sum: " << sum << std::endl;
    std::cout << "Difference: " << diff << std::endl;

    return 0;
}

步骤 5: 编译并链接 C++ 程序

使用 GCC 编译器编译 C++ 程序,并链接静态库。

g++ main.cpp -L. -lmath -o myprogram

这里 -L. 指定了库文件的位置(当前目录),-lmath 指定了要链接的库名。

步骤 6: 运行程序

现在,您可以运行程序来验证静态库是否正确链接。

./myprogram

输出结果

Sum: 7
Difference: 5

四、Qt在Windows下使用 动态库和静态库

步骤 1: 创建静态库

创建静态库项目
  1. 打开 Qt Creator
  2. 新建项目
    • 选择 New Project > Libraries > Static Library
    • 输入项目名称,例如 MathLibrary
    • 选择 C++ 作为源语言。
    • 选择一个合适的位置来保存项目。
添加源代码文件
  1. 创建源文件

    • 在 src 文件夹下创建 addition.cpp 和 subtraction.cpp 文件。
    • 在 addition.cpp 中编写加法函数:
      #include <cmath>
      
      int add(int a, int b) {
          return a + b;
      }
    • 在 subtraction.cpp 中编写减法函数:
      #include <cmath>
      
      int subtract(int a, int b) {
          return a - b;
      }
  2. 添加头文件

    • 创建 mathlibrary.h 文件,并在其中声明函数:
      #ifndef MATHLIBRARY_H
      #define MATHLIBRARY_H
      
      extern "C" {
          int add(int a, int b);
          int subtract(int a, int b);
      }
      
      #endif // MATHLIBRARY_H
  3. 在项目文件中添加源文件

    • 打开 MathLibrary.pro 文件。
    • 添加源文件到 SOURCES 列表中:
      SOURCES += src/addition.cpp \
                  src/subtraction.cpp
      HEADERS  += mathlibrary.h
  4. 构建静态库

    • 使用 Qt Creator 构建项目。这将生成 libMathLibrary.lib 文件。

步骤 2: 创建动态库

创建动态库项目
  1. 新建项目

    • 选择 New Project > Libraries > Shared Library
    • 输入项目名称,例如 MathLibraryDynamic
    • 选择一个合适的位置来保存项目。
  2. 添加源代码文件

    • 在 src 文件夹下创建 addition.cpp 和 subtraction.cpp 文件。
    • 使用与静态库相同的源代码。
  3. 添加头文件

    • 使用与静态库相同的 mathlibrary.h 文件。
  4. 在项目文件中添加源文件

    • 打开 MathLibraryDynamic.pro 文件。
    • 添加源文件到 SOURCES 列表中:
      SOURCES += src/addition.cpp \
                  src/subtraction.cpp
      HEADERS  += mathlibrary.h
  5. 构建动态库

    • 使用 Qt Creator 构建项目。这将生成 MathLibraryDynamic.dll 文件。

步骤 3: 在 Qt 项目中使用静态库和动态库

创建 Qt 项目
  1. 新建 Qt 项目

    • 选择 New Project > Applications > Qt Widgets Application
    • 输入项目名称,例如 MathApp
    • 选择一个合适的位置来保存项目。
  2. 在项目文件中添加库文件

    • 打开 MathApp.pro 文件。
    • 添加静态库和动态库的路径:
      INCLUDEPATH += path/to/MathLibrary/src
      LIBS += path/to/libMathLibrary.lib
      QMAKE_LFLAGS += -Lpath/to
      QMAKE_LFLAGS += -lMathLibraryDynamic
  3. 添加头文件

    • 在 MathApp.pro 文件中添加头文件路径:
      HEADERS += path/to/MathLibrary/mathlibrary.h
  4. 编写使用库的代码

    • 在 mainwindow.cpp 中使用库中的函数:
      #include "mainwindow.h"
      #include "ui_mainwindow.h"
      #include "mathlibrary.h"
      
      MainWindow::MainWindow(QWidget *parent)
         : QMainWindow(parent)
          , ui(new Ui::MainWindow)
      {
          ui->setupUi(this);
          int sum = add(3, 4);
          int diff = subtract(10, 5);
      
          qDebug() << "Sum: " << sum;
          qDebug() << "Difference: " << diff;
      }
      
      MainWindow::~MainWindow()
      {
          delete ui;
      }
  5. 构建 Qt 项目

    • 使用 Qt Creator 构建项目。
  • 18
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值