Linux 静态库 和 动态库

在Linux系统上,库文件用于共享和重用代码。根据使用方式和链接方式的不同,库文件可以分为静态库和动态库。

静态库(Static Library)

静态库是在编译时被嵌入到最终可执行文件中的库。静态库的扩展名通常是.a。

特点

  1. 独立性:静态库在编译时就被包含在可执行文件中,因此可执行文件独立于库的存在。
  2. 大小增加:由于静态库的代码被直接复制到可执行文件中,最终的可执行文件大小会增加。
  3. 加载速度快:因为库代码已经在可执行文件中,不需要在运行时加载,启动速度较快。
  4. 更新困难:更新静态库中的代码需要重新编译可执行文件。

创建静态库

1.编写源代码:

假设你有两个源文件’foo.c’ 和 ‘bar.c’
foo.c:

// foo.c
#include <stdio.h>void foo() {printf("This is function foo.\n");
}

bar.c:

// bar.c
#include <stdio.h>void bar() {printf("This is function bar.\n");
}

2.编译源文件:

使用 gcc 将源文件编译为目标文件(.o 文件)。

gcc -c foo.c bar.c
这将生成 foo.o 和 bar.o 两个目标文件。

3.创建静态库:

使用 ar 命令将目标文件打包成静态库。

ar rcs libmylib.a foo.o bar.o
这将创建一个名为 libmylib.a 的静态库文件。

使用静态库

1.编写主程序:

创建一个使用静态库的主程序 main.c。

main.c:

// main.c
void foo();
void bar();int main() {foo();bar();return 0;
}

2.编译并链接静态库:

在编译主程序时链接静态库。

gcc -o myprogram main.c -L. -lmylib
其中,-L. 指定库的路径,-lmylib 指定链接的库名(libmylib.a)。

3.运行程序:

执行生成的可执行文件。
./myprogram
输出将会是:
This is function foo.
This is function bar.

动态库(Dynamic Library)

动态库是在运行时被加载的库。动态库的扩展名通常是.so(共享对象)。

特点

  1. 共享性:多个程序可以共享同一个动态库,节省内存和磁盘空间。
  2. 可更新性:更新动态库时,不需要重新编译使用该库的可执行文件,只需替换动态库即可。
  3. 加载速度慢:在运行时加载动态库,启动速度可能比静态库稍慢。
  4. 依赖性:可执行文件依赖动态库的存在和版本匹配,缺失或版本不匹配会导致程序无法运行。

创建动态库

1.编写源代码:

假设你有两个源文件’foo.c’ 和 ‘bar.c’
foo.c:

// foo.c
#include <stdio.h>void foo() {printf("This is function foo.\n");
}

bar.c:

// bar.c
#include <stdio.h>void bar() {printf("This is function bar.\n");
}

2.编译源文件:

使用 gcc 将源文件编译为位置无关代码(Position Independent Code, PIC)的目标文件(.o 文件)。

gcc -fPIC -c foo.c bar.c
这将生成 foo.o 和 bar.o 两个目标文件。

3.创建动态库:

使用 gcc 将目标文件链接成动态库。

gcc -shared -o libmylib.so foo.o bar.o
这将创建一个名为 libmylib.so 的动态库文件。

使用动态库

1.编写主程序:

创建一个使用动态库的主程序 main.c。

main.c:

// main.c
void foo();
void bar();int main() {foo();bar();return 0;
}

2.编译并链接动态库:

在编译主程序时链接动态库。

gcc -o myprogram main.c -L. -lmylib
其中,-L. 指定库的路径,-lmylib 指定链接的库名(libmylib.so)。

3.设置库路径并运行程序:

在运行时,动态库需要在系统的库搜索路径中,可以通过设置 LD_LIBRARY_PATH 环境变量指定路径。

export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH
./myprogram

输出将会是:
This is function foo.
This is function bar.

解释 export LD_LIBRARY_PATH=.: $ LD_LIBRARY_PATH:

export:这是一个 shell 命令,用于设置环境变量,使其对后续的命令和脚本可见。
LD_LIBRARY_PATH=.:将当前目录(. 表示当前目录)添加到 LD_LIBRARY_PATH 中。这样,系统会在当前目录中查找动态库。
:$LD_LIBRARY_PATH:将已有的 LD_LIBRARY_PATH 环境变量的值追加到新的 LD_LIBRARY_PATH 中。这保证了之前设置的搜索路径不会丢失。

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

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

相关文章

ADOP带你了解:SFP 光模块:构建高速网络的关键技术

在数字化时代&#xff0c;企业运营的效率往往取决于数据传输的速度。因此&#xff0c;构建一个可靠的网络基础架构至关重要。本指南深入探讨了小型可插拔&#xff08;SFP&#xff09;光收发器的关键作用&#xff0c;这些设备确保了网络中数据的高效和安全流动。SFP光收发器的设…

【Rust入门教程】hello world程序

文章目录 前言Hello World程序运行总结 前言 对于学习任何一种新的编程语言&#xff0c;我们都会从编写一个简单的Hello World程序开始。这是一个传统&#xff0c;也是一个开始。在这篇文章中&#xff0c;我们将一起学习如何在Rust中编写你的第一个程序&#xff1a;Hello Worl…

【C语言内存函数】

目录 1.memcpy 使用 模拟实现 2.memmove 使用 模拟实现 3.memset 使用 4.memcmp 使用 1.memcpy 使用 void * memcpy ( void * destination, const void * source, size_t num );目的地址 源地址 字节数 destination&#xff1a;指向要复制内…

20240703 每日AI必读资讯

&#x1f916;爆火Character AI惨遭阉割 美国00后集体“失恋” - Character AI曾是00后最火爆的社交软件&#xff0c;但用户发现对话模型变得冷淡&#xff0c;失去趣味。 - 用户流失严重&#xff0c;面临成本高、竞争激烈的挑战&#xff0c;甚至遭到挖角。 - 尽管困难重重&a…

淘宝API接口开发系列:淘宝订单详情API接口与物流电子面单API接口概述

淘宝订单详情API接口与物流电子面单API接口概述 在电子商务领域&#xff0c;API&#xff08;应用程序接口&#xff09;扮演着至关重要的角色&#xff0c;它们使得不同的系统能够相互通信&#xff0c;实现数据的共享和交换。淘宝作为国内最大的电商平台之一&#xff0c;其提供的…

C# 多线程造成CPU占用率高

当线程多的时候就会造成CPU内存占用率过高 private void button1_Click(object sender, EventArgs e){Thread TH1, TH2, TH3, TH4, TH5;TH1 new Thread(Thread1){IsBackground true};TH2 new Thread(Thread2){IsBackground true};TH3 new Thread(Thread3){IsBackground t…

最小步数模型——AcWing 1107. 魔板

最小步数模型 定义 最小步数模型通常是指在某种约束条件下&#xff0c;寻找从初始状态到目标状态所需的最少操作或移动次数的问题。这类问题广泛存在于算法、图论、动态规划、组合优化等领域。具体来说&#xff0c;它涉及确定一个序列或路径&#xff0c;使得按照特定规则执行…

jenkins在使用pipeline时,为何没有方块形视图

项目场景&#xff1a; 安装完Jenkins时后&#xff0c;通过pipeline创建的项目任务。 问题描述 在立即构建后&#xff0c;没有显示每个阶段的视图。 原因分析&#xff1a; 原因是&#xff0c;刚安装的Jenkins&#xff0c;这个视图不是Jenkins自带的功能&#xff0c;而必须安装…

《5小时吃透小red书》读书笔记之打造爆款笔记原理

1.流量推送逻辑&#xff1a; 一篇笔记发布并审核后&#xff0c;平台根据内容提取关键词&#xff0c;开始小范围发布测试&#xff1b;初次先分发到1000个兴趣用户&#xff0c;根据这1000个用户等反馈决定是否给该笔记更多流量和推荐&#xff1b;考核标准是点击率、完播率、互动…

高校实训室:老年实训室的教学案例

本文以高校老年实训室为研究对象&#xff0c;通过详细分析具体的教学案例&#xff0c;探讨了老年实训室在提升学生专业素养和实践能力方面的重要作用。文中介绍了多个具有代表性的教学案例&#xff0c;包括健康评估、康复护理和心理关怀等方面&#xff0c;阐述了其教学目标、实…

EDA 虚拟机 Synopsys Sentaurus TCAD 2017.09 下载

下载地址&#xff08;制作不易&#xff0c;下载使用需付费&#xff0c;不能接受的请勿下载&#xff09;&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1327I58gvV1usWSqSrG7KXw?pwdo03i 提取码&#xff1a;o03i

Boss直聘,无良厂商,乱封号

耽误招工作&#xff0c;瞎吉儿封号 哥们单身 需要女生多的公司 问一下都不行&#xff0c;什么尿性 直接就给你封了 装什么呢 辣鸡boss 倒闭吧赶紧 我是狗子&#xff0c;希望你倒闭&#xff01;

枚举类示例

package net.cnki.editor.costcenter.pojo.enums;import lombok.Getter;import java.util.Arrays;/*** 费用枚举接口*/ public interface CosttypeEnumInterface {/*** 费用类型和费用信息-> 费用性质, 支付人 , 收取人, 费用信息状态*/Getterenum CosttypePayerAndReceiveE…

使用PHP实现Web爬虫

web爬虫是一种自动化工具&#xff0c;可以浏览互联网上的网页&#xff0c;收集信息并存储在一个数据库中。在今天的大数据时代&#xff0c;web爬虫越来越重要&#xff0c;因为它可以查找大量信息并进行数据分析。在本文中&#xff0c;我们将学习如何使用php编写web爬虫&#xf…

Radxa 学习摘录

文章目录 1、参考资料2、硬件知识CIF 和 ISP 3、shell4、交叉编译工具链5、问题6、DTS7、驱动 1、参考资料 技术论坛&#xff08;推荐&#xff09; 官方资料下载 wiki资料 u-boot 文档 u-boot 源码 内核文档 内核源码 原理图 radxa-repo radxa-build radxa-pkg radxa-doc…

寻找最适合你的交易风格

与Eagle Trader一起&#xff0c;您将拥有一位坚不可摧的合作伙伴&#xff0c;为您的交易之路增添坚实信心&#xff0c;并重塑交易体验的每一个细节。我们量身定制的交易环境&#xff0c;更能让您精准捕捉并驾驭符合您独特交易风格的卓越条件&#xff0c;让交易之旅更加自由畅快…

Python容器 之 字典--定义

1.字典的介绍 1, 字典 dict, 使用 {} 表示 2, 字典是由键(key)值(value)对组成的, key: value 3, 一个键值对是一组数据, 多个键值对之间使用 逗号隔开 4, 在一个字典中, 字典的键 是不能重复的&#xff0c;如果重复原数据会被覆盖 5, 字典中的键 主要使用 字符串类型, 可以是…

Mac可以卸载掉系统自带的软件吗 Mac第三方软件无法卸载是为什么

在使用Mac电脑时&#xff0c;有时候我们会发现系统预装的一些应用并不常用或者不符合个人需求&#xff0c;想要将它们卸载掉。然而&#xff0c;对于系统自带的软件&#xff0c;卸载并不简单&#xff0c;需要谨慎对待以免影响系统稳定性和功能正常运行。下面我们来看看Mac可以卸…

Firefox 编译指南2024 Windows10-使用Git 管理您的Firefox(五)

1. 引言 在现代软件开发中&#xff0c;版本控制系统&#xff08;VCS&#xff09;是不可或缺的工具&#xff0c;它不仅帮助开发者有效管理代码的变化&#xff0c;还支持团队协作与项目管理。Mercurial 是一个高效且易用的分布式版本控制系统&#xff0c;其设计目标是简洁、快速…

Linux CentOS Python 离线安装 pip 使用.whl文件离线安装

1、系统版本 cat /etc/redhat-release #查看系统版本命令 输出&#xff1a;CentOS Linux release 7.9.2009 (Core) 2、在pip 官方网站 下载.whl文件&#xff1a;pip-24.1.1-py3-none-any.whl 3、安装 python -m pip install pip-24.1.1-py3-none-any.whl 3、安装之后运行…