当前位置: 首页 > news >正文

C++学习(十四)(使用库)

我们可以用**“工具箱”“共享工具站”**的比喻来理解静态库和动态库的区别:


1. 静态库(Static Library)

比喻:自备工具箱
  • 特点

    • 编译时整合:把工具(代码)直接塞进你的行李箱(可执行文件)。

    • 独立运行:出门(运行程序)时不需要找别人借工具。

    • 代价:行李箱会变得很重(可执行文件体积大)。

创建和使用步骤:
  • 打包工具:把螺丝刀、锤子的零件(.cpp 文件)组装成工具包(.a 或 .lib 文件)。

    # 示例命令(Linux)
    g++ -c 螺丝刀.cpp 锤子.cpp       # 编译成零件(.o 文件)
    ar rcs 工具箱.a 螺丝刀.o 锤子.o  # 打包成静态库
     
  • 使用工具:旅行时把整个工具箱塞进行李箱。

    g++ 我的程序.cpp 工具箱.a -o 我的程序  # 生成“超重但独立”的行李箱
     

2. 动态库(Dynamic Library)

比喻:共享工具站
  • 特点

    • 运行时借用:行李箱里只放工具借用卡(引用),运行时去工具站(系统路径)拿工具。

    • 轻便灵活:行李箱轻巧(可执行文件小),但要求目的地必须有工具站(依赖库文件)。

    • 共享优势:多个程序可以共用同一套工具(节省内存和磁盘空间)。

创建和使用步骤:
  • 建立工具站:把工具放到共享仓库(.so 或 .dll 文件)。

    # 示例命令(Linux)
    g++ -c -fPIC 电钻.cpp 锯子.cpp      # 编译成可共享的零件(位置无关代码)
    g++ -shared -o 工具站.so 电钻.o 锯子.o  # 创建共享工具站
     
  • 使用工具:带上一张工具借用卡(链接引用)。

    g++ 我的程序.cpp -L. -l工具站 -o 我的程序  # 生成“轻便但依赖工具站”的行李箱
     
      
    • 运行时需要确保工具站在系统能找到的路径(如 /usr/lib)。


对比总结

静态库(自备工具箱)动态库(共享工具站)
整合时机编译时塞进行李箱运行时按需借用
文件体积大(自带所有工具)小(只带借用卡)
依赖性无需外部依赖必须安装对应的共享库
更新维护更新工具需重新打包行李箱更新工具站,所有程序自动受益
内存占用每个程序自带工具(内存冗余)多个程序共享工具(节省内存)

如何选择?

  • 选静态库

    • 程序需要独立分发(如发给用户的安装包)

    • 不想让用户额外安装依赖库

    • 适合小型工具或嵌入式系统

  • 选动态库

    • 程序体积敏感(如手机App)

    • 多个程序共用同一套功能(如系统基础库)

    • 需要频繁更新功能(只需替换库文件)


一句话总结

  • 静态库:自带所有工具,走到哪用到哪,但行李重。

  • 动态库:轻装出行,随地借工具,但依赖“共享工具站”! 🧳🔧

Boost C++ 库

Boost 是一系列高质量且广泛使用的 C++ 库,旨在帮助开发人员编写高效且可移植的代码。它们是模块化的,可以根据需要包含在您的项目中。Boost 库提供各种功能,包括对并行性、多线程、内存管理、字符串作和高级数据结构的支持。

值得注意的组件

以下是一些流行的 Boost 库的列表:

  • Boost.Asio:提供网络和底层 I/O 服务。
  • Boost.Bimap: 一个双向的 map 数据结构。
  • Boost.Filesystem:提供可移植的文件系统作。
  • Boost.Graph:实现各种图算法和数据结构。
  • Boost.Multithreading:提供多线程、同步和线程管理工具。

用法

  • 首先,根据文档下载并安装 Boost 库。
  • 安装后,在 C++ 代码中包含必要的标头,然后开始使用 Boost 工具。

下面是一个使用的示例(注意:Boost.Filesystem 现在是 C++17 标准库的一部分):boost::filesystem

#include <iostream>
#include <boost/filesystem.hpp>

int main() {
    boost::filesystem::path path("directory_path");
  
    if (boost::filesystem::exists(path)) {
        std::cout << "Path: " << path << " exists!" << std::endl;
      
        if (boost::filesystem::is_directory(path)) {
            std::cout << "Path: " << path << " is a directory." << std::endl;
        } else if (boost::filesystem::is_regular_file(path)) {
            std::cout << "Path: " << path << " is a regular file." << std::endl;
        }
    } else {
        std::cout << "Path: " << path << " does not exist!" << std::endl;
    }

    return 0;
}

相关文章:

  • JVM详解
  • C# 开发工具Visual Studio下载和安装
  • vue3中子组件获取父组件的name,父组件不做修改动作
  • JavaScript中的主要知识点
  • Windows 图形显示驱动开发-WDDM 3.2-GPU-P 设备上的实时迁移(一)
  • 【vscode】一键编译运行c/c++程序
  • 深度解析 slabtop:实时监控内核缓存的利器
  • 短分享-Flink图构建
  • python里调用外部控制台应用程序的方法~
  • 【人工智能学习之局部极小值与鞍点】
  • 测试用例详解
  • BetaFlight源码解读01
  • MacOS Big Sur 11 新机安装brew wget python3.12 exo
  • MySQL 中,SELECT ... FOR UPDATE
  • 游戏引擎学习第140天
  • 【C++】Class(1)
  • 虚拟机 | Ubuntu图形化系统: open-vm-tools安装失败以及实现文件拖放
  • 数据可视化大屏产品设计方案(附Axure源文件预览)
  • 【JavaSE-7】方法的使用
  • 【C语言】函数篇
  • 重庆城市轨道交通拟听证调价:公布两套票价方案,正征求意见
  • 媒体评教师拎起学生威胁要扔下三楼:师风师德不能“悬空”
  • 浙江省委金融办原副主任潘广恩被“双开”
  • 《日出》华丽的悲凉,何赛飞和赵文瑄演绎出来了
  • 上海锦江乐园摩天轮正在拆除中,预计5月底6月初拆完
  • 国际奥委会举办研讨会,聚焦如何杜绝操纵比赛