静态编译与动态编译的区别以及为什么需要静态编译

2023-11-07

2.Linux 应用开发通常要考虑三个问题,即:1)在 Linux 应用程序开发过程中遇到过标准库链接在不同 Linux 版本下不兼容的问题; 2)在 Linux 静态库的制作过程中发现有别于  Windows 下静态库的制作方法;3)在 Linux 应用程序链接第三方库或者其他静态库的时候发现链接顺序的烦人问题。本文就这三个问题针对 Linux 下标准库链接和如何巧妙构建 achrive(*.a) 展开相关介绍。
   两个要知道的基本知识
  Linux 应用程序因为 Linux 版本的众多与各自独立性,在工程制作与使用中必须熟练掌握如下两点才能有效地 工作和理想地运行。
  1、Linux 下标准库链接的三种方式(全静态 , 半静态 (libgcc,libstdc++), 全动态)及其各自利弊。
  2、Linux 下如何巧妙构建 achrive(*.a),并且如何设置链接选项来解决 gcc 比较特别的链接库的顺序问题。
   三种标准库链接方式选项及对比
  为了演示三种不同的标准库链接方式对最终应用程序产生的区别, 这里用了一个经典的示例应用程序 HelloWorld 做演示,见 清单 1 HelloWorld。
   清单 1. HelloWorld
#include <stdio.h>
#include <iostream>
using std::cout;
using std::endl;
int main(int argc, char* argv[])
{
printf("HelloWorld!(Printed by printf)\n");
cout<<"HelloWorld!(Printed by cout)"<<endl;
return 0;
}
  三种标准库链接方式的选项及区别见 表 1
   表 1. 三种标准库链接方式的选项及区别
  上述三种标准库链接方式中,比较特殊的是 半静态链接方式,主要在于其还需要在链接前增加额外的一个步骤:
  ln -s g++ -print-file-name=libstdc++.a,作用是将 libstdc++.a(libstdc++ 的静态库)符号链接到本地工程链接目录。
  -print-file-name 在 gcc 中的解释如下:
  -print-file-name=<lib> Display the full path to library <lib>
  为了区分三种不同的标准库链接方式对最终生成的可执行文件的影响,本文从两个不同的维度进行分析比较:
   维度一:最终生成的可执行文件对标准库的依赖方式(使用 ldd 命令进行分析)
  ldd 简介:该命令用于打印出某个应用程序或者动态库所依赖的动态库
  涉及语法:ldd [OPTION]… FILE…
  其他详细说明请参阅 man 说明。
  三种标准库链接方式最终产生的应用程序的可执行文件对于标准库的依赖方式具体差异见 图 1、图 2、图 3所示:
  
图 1. 全静态标准库链接方式
  图 2. 全动态标准库链接方式
  图 3. 半静态(libgcc,libstdc++) 标准库链接方式
  通过上述三图,可以清楚的看到,当用 全静态标准库的链接方式时,所生成的可执行文件最终不依赖任何的动态标准库,
  而 全动态标准库的链接方式会导致最终应用程序可执行文件依赖于所有用到的标准动态库。
  区别于上述两种方式的 半静态链接方式则有针对性的将 libgcc 和 libstdc++ 两个标准库非动态链接。
  (对比 图 2与 图 3,可见在 图 3中这两个标准库的动态依赖不见了)
  从实际应用当中发现,最理想的标准库链接方式就是半静态链接,通常会选择将 libgcc 与 libstdc++ 这两个标准库静态链接,
  从而避免应用程序在不同 Linux 版本间标准库依赖不兼容的问题发生。
   维度二 : 最终生成的可执行文件大小(使用 size 命令进行分析)
  size 简介:该命令用于显示出可执行文件的大小
  涉及语法:size objfile…
  其他详细说明请参阅 man 说明。
  三种标准库链接方式最终产生的应用程序的可执行文件的大小具体差异见 图 4、图 5、图 6所示:
   
图 4. 全静态标准库链接方式
  图 5. 全动态标准库链接方式
  图 6. 半静态(libgcc,libstdc++) 标准库链接方式
  通过上述三图可以看出,最终可执行文件的大小随最终所依赖的标准动态库的数量增加而减小。
  从实际应用当中发现,最理想的是 半静态链接方式,因为该方式能够在避免应用程序于
  不同 Linux 版本间标准库依赖不兼容的问题发生的同时,使最终生成的可执行文件大小最小化。
   示例链接选项中所涉及命令(引用 GCC 原文):
  -llibrary
  -l library:指定所需要的额外库
  -Ldir:指定库搜索路径
  -static:静态链接所有库
  -static-libgcc:静态链接 gcc 库
  -static-libstdc++:静态链接 c++ 库
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

静态编译与动态编译的区别以及为什么需要静态编译 的相关文章

  • ROS机器人语音模块

    ROS机器人语音模块 文章目录 ROS机器人语音模块 零 乘骐骥以驰骋兮 来吾道夫先路 壹 路漫漫其修远兮 吾将上下而求索 贰 苟余情其信姱以练要兮 长顑颔亦何伤 叁 不吾知其亦已兮 苟余情其信芳 肆 虽体解吾犹未变兮 岂余心之可惩 末 亦
  • 【仿真】Carla介绍与使用 [1] (附代码手把手讲解)

    0 参考与前言 主要介绍无人驾驶的仿真环境CARLA 开源社区维护 以下为相关参考链接 Carla官方文档 建议后续找的时候 先按好版本号 有些功能 api 是新版本里有的 Carla官方github Youtube Python Wind
  • vue css >>> , /deep/ 深度选择器

    vue引用了第三方组件 有时候我们需要改写第三方组件的样式 而又不想去除scoped属性造成组件之间的样式污染 此时只能通过 gt gt gt 穿透scoped 有些Sass 之类的预处理器无法正确解析 gt gt gt 这时可以使用 de
  • stm32 利用链表和定时器动态实现led等器件周期性控制

    stm32 esp8266 ota系列文章 stm32 esp8266 ota 快速搭建web服务器之docker安装openresty stm32 esp8266 ota升级 tcp模拟http stm32 esp8266 ota升级 h
  • 初探 ModBus4j -简单使用指南

    目录 前言 开发环境 工具准备 具体实现 下载Modbus4j 解决空指针异常 解决数组越界 测试 测试环境准备 正式测试 前言 之前提到过 由于项目需求 需要封装 ModBus协议 ModBus协议较早 网上开源开源库也不少 可参见 Mo
  • STM32驱动8266-----8266AP模式

    找了很久 一直没有找到驱动的程序 查一些资料 字写了一个简单程序 记录分享一下 void esp8266 inittcp void printf AT CIPMODE 2 r n 设置AP模式 delay ms 10000 延时函数 pri
  • vue3.0教程——搭建Vue脚手架【简化版】

    目录 哈喽 大家好丫 你们的小郭子又来啦 一 环境要求 1 node安装 前端开发环境 2 vue cli脚手架安装 二 安装依赖 1 使用命令行安装以下依赖 2 通过 vue ui 命令以图形化界面来管理项目依赖 3 导入你刚刚项目的地址
  • 装系统使用默认administrator用户

    在设置键盘布局界面按下Ctrl Shift F4重启 进入系统后 见到一个 系统准备工具 3 14 开始 运行 输入 XCOPY windir System32 svchost exe windir System32 oobe audit
  • MyBatis框架( 项目构建笔记 )

    MyBatis框架 项目构建笔记 一 框架 二 获取参数 三 查询 四 模糊查询 批量删除 五 resultMap和映射关系 五 动态SQL 基本功能实现的项目结构 将SqlSessionFactory 使用工具类进行封装 映射文件的名称要
  • 牛客 AB28 快速幂 JAVA

    描述 请你计算 ab mod p 的值 一共有 q 次询问 输入描述 第一行输入一个正整数 q 代表询问次数 接下来每行输入三个正整数 a b p 代表一次询问 数据范围 1 1051 q 105 1 1071 a b p 107 输出描述
  • BatchNormalization、LayerNormalization、InstanceNorm、GroupNorm、SwitchableNorm总结

    本篇博客总结几种归一化办法 并给出相应计算公式和代码 1 综述 1 1 论文链接 1 Batch Normalization https arxiv org pdf 1502 03167 pdf 2 Layer Normalizaiton
  • 解决git分支切换时遇到的问题

    Please commit your changes or stash them before you switch branches问题的解决 在项目开发的过程中 有时候会遇到一个分支上的BUG还没解决 另一个分支上的BUG又急需解决 这
  • docker 安装mysql总是报错

    完全卸载mysql 把所有的mysql 相关的文件全部删除 find name mysql 查到文件全部删除
  • OpenGL 入门 19:内建变量、接口块、Uniform缓冲

    一 内建变量 查询所有的内建变量的话 请查看OpenGL的wiki 顶点着色器 Input 变量名称 变量类型 变量语义 作用 gl VertexID int 索引 当使用glDrawElements 存储的是正在绘制顶点的当前索引 当使用
  • linux下多线程的创建和结构体传参

    下面总结一下linux下多线程的创建和传参 这里的传的参数是结构体的地址 然后在子线程中输出所传结构体对象的值 实现过程非常简单 其中pthread create 创建子线程 pthread join 是等待阻塞子线程结束 pthread
  • 在Python学习中遇到的一个疑问(可能已解决)

    文章目录 问题 分析 问题 从网上扒拉出来一段代码 是关于函数重写的 输出结果比较正常 但某些函数不太懂 python usr bin python3 class Vector def init self a b self a a self
  • Vue组件之间的通信方式

    六种方式 1 props emit 适用于 父子组件通信 略 2 ref 与 parents children 适用于父子组件通信 不好维护 不推荐使用 3 EventBus 适用于 父子 隔代 兄弟组件通信 这种方法通过一个空的 Vue
  • 每日sql-复购率问题count+case+timediff类函数

    记录一下案例 下次直接拿起来用
  • Python异常捕获及自定义异常类

    Python异常捕获及自定义异常类 一 什么是异常 异常是一个与业务逻辑无关的BUG 一个潜在错误或者网络错误事件等 如 尚未实现的函数 缩进错误 Python语法错误等 该事件可能会在程序执行过程中发生 影响程序的正常执行 在Python

随机推荐

  • 4.单链表ADT模板简单应用算法设计:单链表中前 m 个元素和后 n 个元素的互换

    问题描述 目的 使用C 模板设计单链表的抽象数据类型 ADT 并在此基础上 使用单链表ADT的基本操作 设计并实现单链表的简单算法设计 内容 1 请使用模板设计单链表的抽象数据类型 由于该环境目前仅支持单文件的编译 故将所有内容都集中在一个
  • HJ77 火车进站

    Powered by NEFU AB IN Link 文章目录 HJ77 火车进站 题意 思路 代码 HJ77 火车进站 题意 给定一个正整数N代表火车数量 0
  • C# WPF+skyline可视化学习笔记(一)------在WPF中加载fly地图

    我是学Java的 校招进了公司 是做这个的 我就只有现学了 还好有耐心的师傅和同事们友好帮助 不然我可能就凉了 好了 话不多说 本章内容就是使用vs2017 创建一个WPF项目并且一步一步手把手加载fly地图文件吧 前提准备 你得有这个软件
  • Java聊天--聊天界面

    import java awt import javax swing public class myMain extends JFrame JTextField tsend 在外部声明文本框 用来写留言 Choice clist 声明下拉框
  • 分享一个自媒体副业,认真做可以月入6000+

    做的这个副业并不难 每天花费2 3小时做视频剪辑 上个月一个新账号收益6000多 如果你现在每天的空闲时间比较多 也可以去尝试着做一下视频剪辑 这期内容来把方法分享给粉丝们 如果对你有所帮助 记得点赞支持一下大周 很多人都不知道我们在自媒体
  • Jenkins配置及插件安装

    Jenkins里应该如何把master节点以及slave节点搞到一起 进行一个联系 首先应该访问到安装好Jenkins的机器 下图是Jenkins首页的内容 暂时没有任何的流水线及agent 完善一下基本的信息 root jenkins m
  • TVM(一):简介与安装

    简介 TVM是一个用于深度学习系统的编译器堆栈 它旨在缩小以生产力为中心的深度学习框架与以性能和效率为中心的硬件后端之间的差距 TVM与深度学习框架合作 为不同的后端提供端到端编译 换句话说 TVM就是一种将深度学习工作负载部署到硬件的端到
  • 【Endnote20】批量导入enw格式,便捷快速

    1 将所有参考文献的enw文件整理到同一文件夹内 2 command a全选 我是mac win的话应该ctrl a全选 3 右键点击打开 4 完成
  • FreeRTOS-定时器详解

    作者简介 嵌入式入坑者 与大家一起加油 希望文章能够帮助各位 个人主页 rivencode的个人主页 系列专栏 玩转FreeRTOS 保持学习 保持热爱 认真分享 一起进步 目录 前言 一 软件定时器的简介 二 软件定时器的创建 1 软件定
  • 对登录接口的简单图形验证码进行识别 20221004

    Python黑客编程原理与实战 作业 二 1 编程题 1 语言限定为python3 环境准备 使用虚拟python3环境 pip3 install virtualenv virtualenv python 3 10 vpy3 10 sour
  • 什么是持续集成的自动化测试

    如今互联网软件的开发 测试和发布 已经形成了一套非常标准的流程 最重要的组成部分就是持续集成 Continuous integration 简称CI 目前主要的持续集成系统是Jenkins 那么什么是持续集成 持续集成指的是 频繁地 一天多
  • RainDiffusion: When Unsupervised Learning Meets Diffusion Models for Real-world Image Deraining

    一 摘要 介绍及相关工作 传统方法 图像去雨的传统方法通常利用不同的先验 例如稀疏编码 高斯混合模型和低秩表示 然而 这些手工制作的先验表现出有限的代表性能力 导致在复杂和多变的下雨情况下的结果不佳 监督 通过从大量合成的无雨 下雨图像对中
  • 基于Pytorch的深度学习 —— 非线性激活函数

    文章目录 作用 Sigmoid tanh ReLU Leaky ReLU SoftPlus 开发环境 作用 非线性激活函数获取输入 并对其进行数学变换后生成输出 非线性激活函数为神经元引入了非线性因素 使得神经网络可以任意逼近任何非线性函数
  • [编程开发工具-7]:四款功能强大的代码比较工具:Araxis Merge、Beyond compare、DiffMerge、WinMerge

    前言 我们经常会遇到需要比较同一文件的不同版本 特别是代码文件 比如在两个不同的github仓库之间merge代码 如果人工去对比查看 势必费时实力还会出现纰漏和错误 因此我们需要借助一些代码比较的工具来自动完成这些工作 对于专业人员 立即
  • 我制作了python脚本自动抢购淘宝秒杀产品,学会优先享受双十一福利

    这是本文的标题 前言 第一步 第二步 第三步 第四步 零基础Python学习资源介绍 Python学习路线汇总 Python必备开发工具 Python学习视频600合集 实战案例 100道Python练习题 面试刷题 资料领取 好文推荐 前
  • 【笔记:模拟CMOS集成电路】两级运算放大器设计与仿真(带版图)

    笔记 模拟CMOS集成电路 两级运算放大器设计与仿真 带版图 前言 1 电路分析 1 1电路结构 电路描述 1 2小信号分析 1 3公式 2指标设计 2 1预期设计指标参数 2 2参数分析 1 确定gm1 gm6 2 分配电流 3 确定M1
  • 技术管理者培训小结一:内在修养

    经过技术管理者培训课程 将一些内容以小结方式记录下来 既能作为培训沉淀 又能作为备忘 一 管理者的内在修养 1 情绪控制应该脱离 刺激 回应模式 人的终极自由是自己的情绪由自己控制 发挥四大天赋潜能 自我意识 想象力 良知 独立意志 由受制
  • Java线程安全性中的对象发布和逸出

    转自 http www cnblogs com yulinfeng p 5975728 html 发布 Publish 和逸出 Escape 这两个概念倒是第一次听说 不过它在实际当中却十分常见 这和Java并发编程的线程安全性就很大的关系
  • 银行编码规则

    编号 银行名称 001 中国人民银行 011 国家金库 102 中国工商银行 103 中国农业银行 104 中国银行 105 中国建设银行 201 国家开发银行 202 中国进出口银行 203 中国农业发展银行 301 交通银行 302 中
  • 静态编译与动态编译的区别以及为什么需要静态编译

    1 由于博创杯开发板的不可更改性 所以导致的结果是什么呢 那就是无法动态连接 还有一个需要注意的是 板子上面上面用的是4 4 1的gcc 一旦你Ubuntu使用的开发板高于它 都有可能导致运行程序失败 这就是程序失败的例子 2 Linux