linux gcc 静态库的简单介绍

在 Linux 上,使用 GCC 编译器来创建和调用静态库时,涉及的实现原理和调用机制可以分为以下几个步骤:

1. 静态库的创建

静态库(通常以 .a 结尾)是由多个目标文件(.o 文件)打包在一起的归档文件。它们在编译期间被直接链接到应用程序中。

创建静态库的过程

  • 首先编译源文件,生成目标文件( .o 文件)。
gcc -c foo.c -o foo.o
gcc -c bar.c -o bar.o
  • 然后使用
  ar

(archive)命令将多个目标文件打包成静态库。

 ar rcs libmylib.a foo.o bar.o

这里的 ar 命令的参数:

  • r 表示插入文件或替换已存在的文件。
  • c 表示创建库文件。
  • s 表示创建库文件索引,以便在链接时快速查找函数。

2. 静态库的调用机制

当使用静态库时,库中的代码在编译时被复制到可执行文件中。这意味着:

  • 所有需要的函数和数据从静态库被直接嵌入到最终的可执行文件中。
  • 链接静态库后,生成的可执行文件不需要在运行时再依赖静态库。

链接静态库的过程

  • 编译并链接时,将静态库作为参数传递给 GCC。

    gcc main.c -L. -lmylib -o myapp
    

    这里的参数:

    • -L. 表示链接路径是当前目录。
    • -lmylib 表示链接名为 libmylib.a 的静态库(注意,lib 前缀和 .a 后缀可以省略)。

调用机制

  • 链接器会从静态库中提取所需的目标文件,并将其复制到生成的可执行文件中。
  • 因为所有必要的代码在编译时都被复制到可执行文件中,运行时不会再需要外部库文件。

3. 静态库的原理

  • 归档文件:静态库本质上是一个简单的归档文件,包含多个目标文件和一个索引。索引用于加速链接时对符号的查找。
  • 符号解析:在链接过程中,链接器会解析每个目标文件的符号(如函数和变量名),如果在目标文件中找不到定义,它会尝试在静态库中查找。如果找到匹配的定义,链接器会将静态库中的代码拷贝到可执行文件中。
  • 代码嵌入:静态库中的代码会被直接嵌入到生成的可执行文件中,因此静态库不需要像动态库那样在运行时被加载。结果是可执行文件会变得更大。

4. 优缺点

  • 优点

    • 运行时无需库文件:静态库的代码在编译时就已嵌入,因此在运行时不需要依赖外部库文件,分发程序时只需要分发一个可执行文件即可。
    • 性能:由于不涉及动态加载库,静态库的调用没有额外的运行时开销。
  • 缺点

    • 代码冗余:多个使用同一个静态库的程序会各自拥有该库的一份副本,导致二进制文件变大。
    • 更新不便:一旦静态库更新,所有使用它的程序都需要重新编译。

5. 示例

假设有如下 C 文件:

foo.c:

void foo() {printf("Hello from foo\n");
}

main.c:

#include <stdio.h>void foo(); // 函数声明int main() {foo();return 0;
}

创建静态库:

gcc -c foo.c -o foo.o
ar rcs libfoo.a foo.o

链接并编译:

gcc main.c -L. -lfoo -o myapp

运行程序:

./myapp

总结

静态库在编译时被直接链接到程序中,生成的可执行文件包含了库的所有代码。它的实现原理依赖于目标文件的归档和符号解析,调用机制通过在编译期间将库中的代码复制到最终的可执行文件中完成。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机毕业设计之:教学平台微信小程序(

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

Linux —— 多线程

一、本篇重点 1.了解线程概念&#xff0c;理解线程与进程区别与联系 2.理解和学会线程控制相关的接口和操作 3.了解线程分离与线程安全的概念 4.学会线程同步。 5.学会互斥量&#xff0c;条件变量&#xff0c;posix信号量&#xff0c;以及读写锁 6.理解基于读写锁的读者写…

用 HTML + JavaScript DIY 一个渐进式延迟法定退休年龄测算器

为减轻社会和个人因退休年龄变化带来的冲击&#xff0c;近日&#xff0c;全国人民代表大会常务委员会正式发布了关于实施渐进式延迟法定退休年龄的重要决定。 根据该决定&#xff0c;我国将同步启动对男、女职工法定退休年龄的延迟计划。这一调整将采取渐进式的方式进行&#…

第十二周:机器学习笔记

第十二周周报 摘要Abstract机器学习1. Recurrent Neural Network&#xff08;下&#xff09;1.1 RNN的Loss Function怎么求&#xff1f;1.2 RNN奇怪的特性1.3 如何解决 RNN 梯度消失或者爆炸1.4 RNN 其他应用 Pytorch学习1. 现有的网络模型使用以及其修改1.1 在VGG16模型添加Mo…

python-3n+1数链/233

一&#xff1a;3n1数链题目描述 在计算机科学上&#xff0c;有很多类问题是无法解决的&#xff0c;我们称之为不可解决问题。然而&#xff0c;在很多情况下我们并不知道哪一类问题可以解决&#xff0c;哪一类问题不可解决。现在我们就有这样一个问题&#xff0c;问题如下&#…

win11 wsl2安装ubuntu22最快捷方法

操作系统是win11&#xff0c;wsl版本是wsl2&#xff0c;wsl应该不用多介绍了&#xff0c;就是windows上的虚拟机&#xff0c;在wsl上可以很方便的运行Linux系统&#xff0c;性能棒棒的&#xff0c;而且wsl运行的系统和win11主机之间的文件移动是无缝的&#xff0c;就是两个系统…

第二十节:学习Redis缓存数据库实现增删改查(自学Spring boot 3.x的第五天)

这节记录下如何使用redis缓存数据库。 第一步&#xff1a; 先在服务器端安装redis&#xff0c; 下载地址&#xff1a;Releases tporadowski/redis GitHub。 第二步&#xff1a; 安装redis客户端可视化管理软件redisDesktopmanager Redis Desktop Manager - Download 第…

C++ tracy性能分析(二)

环境搭建 项目根目录下 git clone https://github.com/wolfpld/tracy cmake 配置 add_definitions("-DTRACY_ENABLE") add_subdirectory(tracy) include_directories(${TRACY_PUBLIC_DIR}) target_link_libraries(project TracyClient) test.cpp //#define TRACY_C…

完整版:NacosDocker 安装

第一步&#xff1a;先直接通过命令安装 Nacos docker run --name nacos2.2.3 -d -p 8848:8848 -e MODEstandalone f151dab7a111 第二步&#xff1a;创建 Docker 挂载目录 # 创建 log 目录 mkdir -p /root/nacos 第三步&#xff1a;将 Docker 容器的文件复制到挂载目录中 …

[Linux] Linux进程PCB内部信息的深入理解

标题&#xff1a;[Linux] Linux进程PCB内部信息的深入理解 个人主页&#xff1a;水墨不写bug &#xff08;图片来自网络&#xff09; 目录 一.查看进程 二.认识并了解进程的关键信息 I&#xff0c;PID/PPID II&#xff0c;exe III&#xff0c;cwd 三、fork&#xff08;&…

LeetCode[中等] 215. 数组中的第 K 个最大元素

给定整数数组 nums 和整数 k&#xff0c;请返回数组中第 k 个最大的元素。 请注意&#xff0c;你需要找的是数组排序后的第 k 个最大的元素&#xff0c;而不是第 k 个不同的元素。 你必须设计并实现时间复杂度为 O(n) 的算法解决此问题。 思路&#xff1a;基于快排改进的快速…

【云原生安全篇】一文掌握Harbor集成Trivy应用实践

【云原生安全篇】一文掌握Harbor集成Trivy应用实践 目录 1 概念 1.1 什么是 Harbor 和 Trivy&#xff1f; 1.1.1 Harbor 1.1.2 Trivy 1.2 Harbor 与 Trivy 的关系 Trivy 在 Harbor 中的作用&#xff1a; 1.3 镜像扫描工作流程 2 实战案例&#xff1a;在Harbor 配置 Trivy …

初识模版!!

初识模版 1.泛型编程1.1 如何实现一个交换函数呢&#xff08;使得所有数据都可以交换&#xff09;&#xff1f;1.2 那可以不可以让编译器根据不同的类型利用该模子来生成代码呢&#xff1f; 2.模版类型2.1 模版概念2.2 函数模版的原理2.3 函数模板的实例化2.4 模板参数的匹配原…

Windows上创建批处理.bat文件并且注册为开机自启(Python-web微服务)

1. winodws桌面点击创建文本文件 &#xff08;文件名称.txt&#xff09; 2. 将如下代码写入txt文件中 echo off if "%1""h" goto begin start mshta vbscript:createobject("wscript.shell").run("""%~nx0"" h"…

(七)使用SoapUI工具调用WebAPI

1.调用一个无参数的GET请求 [HttpGet(Name "GetWeatherForecast")]public IEnumerable<WeatherForecast> Get(){return Enumerable.Range(1, 5).Select(index > new WeatherForecast{Date DateTime.Now.AddDays(index),TemperatureC Random.Shared.Next(…

科研绘图系列:R语言箱线图(boxplot)

文章目录 介绍加载R包导入数据画图1画图2合并图形系统信息介绍 箱线图展示不同分组的数据分布差异。 加载R包 library(here) library("tidyverse") library("ggpubr") library("scales")

【工具】Windows|两款开源桌面窗口管理小工具Deskpins和WindowTop

总结 Deskpins 功能单一&#xff0c;拖到窗口上窗口就可以置顶并且标记钉子标签&#xff0c;大小 104 KB&#xff0c;开源位置&#xff1a;https://github.com/thewhitegrizzli/DeskPins/releases WindowTop 功能完善全面强大&#xff0c;包括透明度、置顶、选区置顶等一系列功…

如何查看Android设备的dpi

adb shell getprop ro.sf.lcd_density adb shell cat /system/build.prop > build_prop.txt shell cat system/build.prop 结果&#xff1a;参考&#xff1a; 如何查看Android设备的dpi_安卓 查看手机dpi-CSDN博客

ElementUI 用span-method实现循环el-table组件的合并行功能

需要把指定列的相同数据合并起来&#xff08;项目中用的是updateTime&#xff09; 后端返回的数据格式&#xff1a; html&#xff1a; <el-tab-pane label"执行记录概览" name"fourth" v-loading"loading"><el-timeline v-if"re…

windows安装Anaconda教程

一、简介 Anaconda 是一个开源的 Python 和 R 语言的分发平台&#xff0c;专为科学计算和数据分析设计。它包含了包管理器 Conda&#xff0c;可以方便地安装和管理库、环境和依赖项。此外&#xff0c;Anaconda 还附带了许多数据科学工具和库&#xff0c;如 Jupyter Notebook 和…