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.mfbz.cn/a/768890.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

labview技巧——AMC框架安装

AMC工具包的核心概念是队列&#xff0c;队列是一种先进先出&#xff08;FIFO&#xff0c;First In First Out&#xff09;的数据结构&#xff0c;适用于处理并发和异步任务。在LabVIEW中&#xff0c;队列可以用于在不同VI之间传递数据&#xff0c;确保消息的有序处理&#xff0…

LT8668SXC 、LT8668SX-D 、LT8668SX三种芯片的相似与不同

一、LT8668SXC(支持eDP输出&#xff09; 定义:LT8668SXC配置在HDMI2.1标准下工作&#xff0c;最大数据速率为8Gbps。 LT8668SXC还可以配置为在Type-C输入或DP1.4a下工作&#xff0c;数据速率高达8.1Gbps。 eDP1.4b输出由8个数据通道组成&#xff0c;支持RBR (1.62Gbps)、HBR (2…

【应届应知应会】SQL常用知识点50道

SueWakeup 个人主页&#xff1a;SueWakeup 系列专栏&#xff1a;借他一双眼&#xff0c;愿这盛世如先生所愿 个性签名&#xff1a;人生乏味啊&#xff0c;我欲令之光怪陆离 本文封面由 凌七七~❤ 友情提供 目录 数据库的概念 (什么是数据库) RDBMS NOSQL 数据库的分类 …

分布式锁——基于Redis分布式锁

单机锁 服务器只有一个&#xff0c;JVM只有一个。 用synchronized加锁&#xff0c;对lock对象加锁&#xff0c;只有线程1结束&#xff0c;线程2,3才会开始。 再用uid避免一个线程多次进来。 分布式锁 真正上线时&#xff1a; 【注&#xff1a;这些服务器连接的是一个Redis集…

FreeRTOS和UCOS操作系统使用笔记

FreeRTOS使用示例 UCOS使用示例 信号量使用 信号量访问共享资源区/ OS_SEMMY_SEM; //定义一个信号量&#xff0c;用于访问共享资源OSSemCreate ((OS_SEM* )&MY_SEM, //创建信号量&#xff0c;指向信号量(CPU_CHAR* )"MY_SEM", //信号量名字(OS_SEM_CTR )1, …

STM32入门笔记(03): ADC(SPL库函数版)(2)

A/D转换的常用技术有逐次逼近式、双积分式、并行式和跟踪比较式等。目前用的较多的是前3种。 A/D转换器的主要技术指标 转换时间 分辨率 例如&#xff0c;8位A/D转换器的数字输出量的变化范围为0&#xff5e;255&#xff0c;当输入电压的满刻度为5V时&#xff0c;数字量每变化…

Google Play上架防关联,打包环境是关联因素之一还是无足轻重?

在Google Play上架应用&#xff0c;对于矩阵式上架或马甲包的开发者来说&#xff0c;防关联的处理技能是必须要精通的。想象一下&#xff0c;你辛辛苦苦开发的应用&#xff0c;因为一些看似微不足道的细节&#xff0c;比如打包环境的问题&#xff0c;就可能被谷歌无情下架或封号…

力扣双指针算法题目:移动零

1.题目 . - 力扣&#xff08;LeetCode&#xff09; 2.思路解析 这个题目的思路和“使用递归排序快速排序解决数组的排序问题”相同 class solution { public:void QuickSort(vector<int>& nums, int left, int right){if (left > right) return;int key left…

信息收集---端口服务信息收集

1. 什么是端口 是设备与外界通讯交流的出口。端口可分为虚拟端口和物理端口&#xff0c;其中虚拟端口指计算机内部或交换机路由器内的端口&#xff0c;不可见。例如计算机中的80端口、21端口、23端口等。物理端口又称为接口&#xff0c;是可见端口&#xff0c;计算机背板的RJ45…

我在高职教STM32——时钟系统与延时控制(2)

大家好&#xff0c;我是老耿&#xff0c;高职青椒一枚&#xff0c;一直从事单片机、嵌入式、物联网等课程的教学。对于高职的学生层次&#xff0c;同行应该都懂的&#xff0c;老师在课堂上教学几乎是没什么成就感的。正因如此&#xff0c;才有了借助 CSDN 平台寻求认同感和成就…

Http 实现请求body体和响应body体的双向压缩方案

目录 一、前言 二、方案一(和http header不进行关联) 二、方案二(和http header进行关联) 三、 客户端支持Accept-Encoding压缩方式,服务器就一定会进行压缩吗? 四、参考 一、前言 有时请求和响应的body体比较大,需要进行压缩,以减少传输的带宽。 二、方案一(和…

助力构建新型电力系统自主可控实时底座

近日&#xff0c;2024亚洲新型电力系统及储能展览会&#xff06;亚洲新型电力及储能论坛会在广州广交会展馆圆满落下帷幕&#xff01;科东软件携多款电力产品亮相展会,并在2024亚洲新型电力及储能论坛发表《“鸿道Intewell操作系统助力构建新型电力系统自主可控实时底座”》的主…

Unity之创建与导出PDF

内容将会持续更新&#xff0c;有错误的地方欢迎指正&#xff0c;谢谢! Unity之创建与导出PDF TechX 坚持将创新的科技带给世界&#xff01; 拥有更好的学习体验 —— 不断努力&#xff0c;不断进步&#xff0c;不断探索 TechX —— 心探索、心进取&#xff01; 助力快速…

2024-2025年本田维修电路图线路图接线图资料更新

此次更新了2024-2025年本田车系电路图资料&#xff0c;覆盖市面上99%车型&#xff0c;包括维修手册、电路图、新车特征、车身钣金维修数据、全车拆装、扭力、发动机大修、发动机正时、保养、电路图、针脚定义、模块传感器、保险丝盒图解对照表位置等等&#xff01; 汽修帮手汽…

日期和时区

日期 时区 修改时区可分为两步 删除系统自带的 localtime 文件 rm -f /etc/localtime 将系统中内置的 Shanghai 文件软连接到 /etc/localtime中 sudo ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

Unity3D中,AI角色Rigidbody旋转导致的动画问题

在制作一些AI角色的时候&#xff0c;可能会运用到Rigidbody组件来使AI角色拥有一些相关的物理属性&#xff0c;但是AI角色在受到一些物理碰撞或者惯性等原因&#xff0c;会发生旋转导致动画出现意料外的错误&#xff0c;比如在由动转静的时候&#xff0c;可能会发生向前翻转等一…

TP8/6 子域名绑定应用

原www.xxx.com/admin改为admincms.xxx.com config/app.php

【Linux】线程——线程的概念、线程的特点、线程的优点和缺点、线程和进程、线程函数的使用

文章目录 Linux线程1. 线程的概念1.1 什么是线程 2. 线程的特点2.1 线程的优点2.2 线程的缺点2.4 线程和进程 3. 线程函数的使用pthread_create() 创建线程pthread_self() 获取线程IDpthread_exit() 线程终止pthread_cancel() 线程取消pthread_join() 线程等待pthread_detach()…

Element-UI - el-table中自定义图片悬浮弹框 - 位置优化

该篇为前一篇“Element-UI - 解决el-table中图片悬浮被遮挡问题”的优化升级部分&#xff0c;解决当图片位于页面底部时&#xff0c;显示不全问题优化。 Vue.directive钩子函数已在上一篇中详细介绍&#xff0c;不清楚的朋友可以翻看上一篇&#xff0c; “Element-UI - 解决el-…

3.js - 色调映射(renderer.toneMapping)

// ts-nocheck// 引入three.js import * as THREE from three// 导入轨道控制器 import { OrbitControls } from three/examples/jsm/controls/OrbitControls// 导入lil.gui import { GUI } from three/examples/jsm/libs/lil-gui.module.min.js// 导入tween import * as TWEEN…
最新文章