C++(GCC)生成和使用静态库

news2024/11/16 18:36:04

C++(GCC)生成和使用静态库

文章目录

  • C++(GCC)生成和使用静态库
    • 1、前言
      • 1.1 什么是静态库
      • 1.2 静态库优缺点
      • 1.3 C++使用静态库的方法
      • 1.4 注意事项
    • 2、linux下C++生成静态库.a
    • 3、链接使用静态库

更多精彩内容
👉个人内容分类汇总 👈

1、前言

1.1 什么是静态库

  • 静态库是一种包含已编译对象文件的归档文件,它们可以被链接到一个可执行文件中。
  • 静态库通常使用文件扩展名 .a(Unix),静态库的命名约定为“lib<library_name>.a”或 .lib(Windows)。
  • 静态库的原理是将多个目标文件打包成一个单独的文件,它可以与其他目标文件链接,并在运行时一起生成可执行文件。
  • 这样做的好处是,静态库中的代码可以在编译时与目标文件捆绑在一起,形成一个可执行文件,使得可执行文件不需要再依赖于静态库来运行。
  • 因此,静态库的代码被复制到了可执行文件中,使得运行效率更高、更加稳定。

1.2 静态库优缺点

静态库是一种可重复使用的代码库,它将一组函数和变量打包在一起,并在链接时静态地嵌入到可执行文件中。

与动态库不同,静态库的代码在运行时不需要额外的加载和解析操作。

静态库的优点:

  1. 性能优势:由于静态库的代码被直接嵌入到可执行文件中,因此在运行时没有额外的加载和解析操作。这使得程序在启动和运行时更快。

  2. 可移植性好:静态库不依赖于系统中已经安装的库。这意味着,当你要在另一个环境中编译或运行你的程序时,你不必担心缺少所需的库文件。

  3. 简单易用:使用静态库时,只需将库文件链接到可执行文件中即可。这很容易实现并且不会引入复杂度。

  4. 版本控制方便:由于静态库被直接嵌入到可执行文件中,因此每个可执行文件都可以包含所需版本的库。这意味着你可以轻松地将不同版本的库与不同版本的应用程序捆绑在一起,而无需担心版本冲突。

静态库的缺点:

  1. 占用空间:由于静态库的代码被嵌入到可执行文件中,因此每个可执行文件都包含了一份完整的库代码。这可能会导致可执行文件变得很大,尤其是当使用多个静态库时。

  2. 更新困难:当库的代码发生更改时,必须重新编译和链接所有依赖该库的应用程序。这使得更新过程较为繁琐。如果一个库是非常通用的并且在许多应用程序中使用,那么它的更新可能需要花费很多时间。

  3. 无法动态更新:由于静态库的代码被静态地嵌入到可执行文件中,因此在运行时不能动态更新库的代码。这意味着,当需要修复库中的错误或添加新功能时,必须重新构建整个应用程序。

1.3 C++使用静态库的方法

在Linux下使用C++静态库的步骤如下:

  1. 编写代码并编译成目标文件(.o),比如 g++ -c test.cpp -o test.o

  2. 然后使用ar命令将编译生成的.o文件打包成静态库文件(.a),比如 ar rcs libtest.a test.o

    • ar是一个用于创建、修改和提取归档文件的命令行工具。归档文件是一种将多个文件组合成单个文件的方式,通常用于将多个目标文件组合为一个库文件(如静态库)或者打包多个文件以备份或分发。
    • r 表示插入新成员(如果原来不存在的话);
    • c 表示创建新档案;
    • s 表示将插入的成员作为符号表保存。
  3. 编写使用静态库的代码,并链接静态库,比如 g++ -o main main.cpp -L. -ltest

    • -L. 表示在当前目录搜索库文件;
    • -lmylib 表示链接名为 libmylib.a 的静态库。
  4. 运行可执行程序,比如 ./test

1.4 注意事项

在C++中使用静态库时需要注意以下事项:

  1. 静态库是一组已编译的代码,因此要确保静态库与你所使用的C++编译器操作系统兼容。否则,可能会导致链接错误或运行时崩溃。
  2. 在编译时,需要指定静态库的路径和名称。在Visual Studio中,可以通过项目属性的“链接器”选项卡来设置这些信息。
  3. 如果在多个项目中使用同一个静态库,建议将其复制到一个公共目录,以便所有项目都可以访问它。
  4. 静态库的头文件应该包含在项目中,并且应该正确地包含在源文件中。如果未正确包含头文件,则编译器将无法找到函数和变量声明,这将导致编译错误。
  5. 在使用静态库时,需要确保库的版本与你的代码兼容。如果你更改了你的代码,可能需要重新编译库以确保它与最新的代码兼容。
  6. 如果你使用的是第三方静态库,则需要查看其文档以了解如何正确使用它。有些静态库需要在编译时启用特殊的标志或链接其他库,以便正常工作。

2、linux下C++生成静态库.a

  1. 创建用于生成静态库的test.h文件

    #ifndef __TEST__
    #define __TEST__
    
    int testFun(int a, int b);
    
    #endif  
    
  2. 创建用于生成静态库的test.cpp文件

    #include "test.h"
    
    int testFun(int a, int b)
    {
        return a + b;
    }
    
    
  3. 使用下列命令将test.cpp文件编译成二进制目标文件

    g++ -c test.cpp -o test.o
    

    在这里插入图片描述

  4. 使用下列命令

    ar rcs libtest.a test.o
    

    在这里插入图片描述

3、链接使用静态库

  1. 创建一个使用静态库的main.cpp文件;

    #include <iostream>
    #include "test.h"
    
    using namespace std;
    
    int main() 
    {
        cout << testFun(10, 20) << endl;
        
        return 0;
    }
    
  2. 使用下列命令编译main.cpp,并链接静态库libtest.a

    g++ main.cpp -o main -L. -ltest
    
  3. 使用./main运行编译后的可执行程序

    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/455982.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

可算是熬出头了,测试4年,费时8个月,入职阿里,涨薪14K

前言 你的努力&#xff0c;终将成就无可替代的自己。 本科毕业后就一直从事测试的工作&#xff0c;和多数人一样&#xff0c;最开始从事点点点的工作&#xff0c;看着自己的同学一步一步往上走&#xff0c;自己还是在原地踏步&#xff0c;说实话这不是自己想要的状态。 一年半…

蓝牙耳机接打电话哪个比较好?接打电话最好的蓝牙耳机

技术已经发展到如此程度&#xff0c;耳机可以淹没嘈杂环境中不断出现的杂音&#xff0c;同时还能让我们在通话、音乐和娱乐方面保持清晰&#xff0c;既然如此&#xff0c;我们就来整理一下2023年适合通话和娱乐的无线耳机清单。 一、南卡小音舱Lite2蓝牙耳机 参考价格&#x…

Ubuntu系统下Python的虚拟环境搭建方法

文章目录 参考链接&#xff1a;一、Python虚拟环境的作用及创建方法简介1. 创建虚拟环境的必要性2. venv、virtualenv、pipenv三种创建虚拟环境方法比较2.1 搭建Python虚拟环境的方法2.2 venv、virtualenv方法2.3 pipenv方法 二、 virtualenv搭建虚拟环境1. 环境准备1.1 安装vi…

AI数字人产品“世优BOTA”发布会落幕,世优科技纪智辉演讲回顾

4月20日&#xff0c;世优科技式发布了新一代AI数字人产品——“世优BOTA”。在会上&#xff0c;世优科技创始人纪智辉介绍了数字人技术、驱动形式、数字人应用、“世优BOTA”的前世今生及未来。 以下是纪智辉的演讲内容概要&#xff1a; 各位嘉宾、各位朋友&#xff1a;大家下…

Storm proxies动态SEO监测优化为什么要大量用到http代理ip?

SEO监测和优化通常需要大量使用HTTP代理IP来实现以下几个方面的需求&#xff1a; 模拟不同地区的搜索结果&#xff1a;搜索引擎通常会根据用户所在地区提供不同的搜索结果&#xff0c;因此需要使用HTTP代理IP模拟不同地区的搜索结果&#xff0c;以便监测和优化针对不同地区的SE…

Matlab 相机标定

详细的原理可以看这篇 计算机视觉-相机标定&#xff0c;写的很赞 Step1. 准备 首先准备打印好的黑白棋盘格图片&#xff0c;并且保证表面的平整&#xff0c;例如35*35的棋盘格&#xff0c;贴在亚克力板上。 Step2. 拍摄 用相机拍摄棋盘格分别在取景框左上角、右上角、左下…

openGauss数据库pg_xlog爆满问题解决

文章目录 问题现象问题定位解决办法总结 问题现象 最近有一个之前搭的环境登不上了&#xff0c;好久没用想拿来测试的时候发现启动不了。启动时报错&#xff1a; [Errno 28] No space left on device query也不行了&#xff0c;提示没有空间了。 查询磁盘使用情况 df -h …

车间设备能源管理系统作用有哪些?

由于能源消耗不断的增加&#xff0c;对于高耗能企业要实现节能转型&#xff0c;淘汰落后高耗能产业&#xff0c;提供能源的有效利用&#xff0c;实现节能减排&#xff0c;合理利用能源&#xff0c;从而促进企业的经营绩效。 车间设备能源管理系统优点 1.精细化管理 可以对车…

探索【Stable-Diffusion WEBUI】的附加功能:图片缩放抠图

文章目录 &#xff08;零&#xff09;前言&#xff08;一&#xff09;附加功能&#xff08;图片处理&#xff09;&#xff08;1.1&#xff09;处理对象&#xff08;Source&#xff09;&#xff08;1.2&#xff09;缩放&#xff08;Scale&#xff09;&#xff08;1.2.1&#xff…

【论文精读】TNNLS 2022 - 基于深度学习的事件抽取研究综述

【论文精读】TNNLS 2022 - 基于深度学习的事件抽取研究综述 【论文原文】&#xff1a;A Survey on Deep Learning Event Extraction Approaches and Applications 【作者信息】&#xff1a;Li, Qian and Li, Jianxin and Sheng, Jiawei and Cui, Shiyao and Wu, Jia and Hei,…

畅谈自然语言处理——初识NLP技术

畅谈自然语言处理——初识NLP 文章目录 畅谈自然语言处理——初识NLP一、引言二、NLP技术的定义分类三、三个发展阶段1、基于规则的算法2、基于统计的NLP算法3、基于深度学习的NLP算法 结语 一、引言 最近&#xff0c;一个名为ChatGPT的模型将计算机领域震撼&#xff0c;它以对…

Linux系统之部署webmin开源管理工具

Linux系统之部署webmin开源管理工具 一、webmin简介1.webmin简介2.webmin特点 二、本地环境介绍1.本次实践目的2.本地环境规划 三、检查本地环境1.检查操作系统版本2.检查系统内核版本 四、配置webmin的yum仓库1.编辑webmin.repo仓库文件2.查看yum仓库状态 五、部署webmin1.添加…

在docker安装Python环境提供给其他docker使用

1. 在宿主机新建一个目录2. 在app目录下新建一个Dockerfile文件本文永久更新地址: 1. 在宿主机新建一个目录 在宿主机上新建一个目录如app/&#xff0c;在app目录里面导入项目需要依赖的包 在项目根目录下输入命令&#xff0c;导出python项目所有的依赖包 pip freeze > r…

(二十二)查找算法-斐波那契算法

1 基本介绍 &#xff08;1&#xff09;黄金分割点是指一条线段分割为两部分&#xff0c;使其中一部分与全长之比等于另一部分与这部分之比。取其前三位数字的近似值是0.618.由于按此比例设计的造型十分美丽&#xff0c;因此称为黄金分割&#xff0c;也称为中外比。这是一个神奇…

Android Fragment懒加载机制分析与详解

一、介绍 Fragment是Android3.0以后引进&#xff0c;称为碎片。它与Activity非常相似&#xff0c;用一个Activity中描述一些行为或者一部分用户界面&#xff0c;使用多个Fragment可以在一个单独的Activity中建立多个UI面板&#xff0c;也可以在多个Activity中使用Fragment。 Fr…

Linux I/O复用函数的使用情况和select接口的介绍

I/O 复用使得程序能同时监听多个文件描述符&#xff0c;这对于提高程序的性能至关重要。通常&#xff0c; 网络程序在下列情况下需要使用 I/O 复用技术&#xff1a; 1.TCP服务器同时要处理监听套接字和连接套接字 2.服务器同时要处理TCP请求和UDP请求。 3.程序同时要处理多个套…

档案库房温湿度管理暂行规定

档案馆温湿度管理暂行规定 来源&#xff1a;本站 日期&#xff1a;2021-8-27 浏览量&#xff1a;1067 档案馆温湿度管理暂行规定 (1985年11月23日国家档案局 国档发〔1985〕42号通知印发) 档案馆是永久保管档案的基地&#xff0c;档案馆建筑是档案馆工作的基础…

用Flutter你得了解的七个问题

Flutter是Google推出的一款用于构建高性能、高保真度移动应用程序、Web和桌面应用程序的开源UI工具包。Flutter使用自己的渲染引擎绘制UI&#xff0c;为用户提供更快的性能和更好的体验。 Flutter使用Dart语言&#xff0c;具有强大的类型、效率和易学能力&#xff0c;基本上你…

前端实战(三):element-ui开关组件的二次封装

目录 二次封装 Switch 开关 原始效果 设计效果 实现步骤 在日常开发过程中&#xff0c;大多数项目主要以 vue 为主&#xff0c;并且现在很多公司仍在使用着 vue。但在使用element-ui组件时通常会遇到一些问题&#xff1a;如组件样式与设计不符合、组件不存在某个功能等等&a…

5年测试经验,自动化都不会?月薪11K都难拿....

我接触了太多测试同行&#xff0c;由于多数同行之前一直做手工测试&#xff0c;现在很迫切希望做自动化测试&#xff0c;其中不乏工作5年以上的同行。 我从事软件自动化测试已经近十年&#xff0c;接触过底层服务端、API 、Web、APP、H5 等等&#xff0c;对自动化算是比较了解…