Linux库概念及相关编程(动态库-静态库)

Linux库概念及相关编程

分文件编程案例

分文件编程是指将程序按功能模块划分成不同的文件进行编写,这种方法有以下好处:

  1. 功能责任划分:每个文件对应一个功能模块,职责明确,易于理解和维护。
  2. 方便调试:可以单独编译和测试每个模块,定位和修复问题更加方便。
  3. 主程序简洁:主程序只负责调用各个模块的接口,代码简洁明了。

例如,一个涉及网络、超声波和电机控制的项目,可以分别创建三个模块:

  • 网络模块 (network.c)
  • 超声波模块 (ultrasonic.c)
  • 电机模块 (motor.c)

这些模块的头文件如下:

  • network.h
  • ultrasonic.h
  • motor.h
静态库和动态库
静态库

静态库在编译时直接被加入到目标程序中。优点是运行速度快,发布时无需提供库文件,但缺点是生成的可执行文件较大。

制作静态库
  1. 编译源文件生成目标文件(.o文件):
    gcc -c calcufuncs.c -o calcufuncs.o

  2. 创建静态库文件(.a文件):
    ar rcs libcalcufunc.a calcufuncs.o

使用静态库
  1. 编译时指定库文件路径和库名:
    gcc calculatorT.c -lcalcufunc -L ./ -o mainProStatic

动态库

动态库在程序运行时被加载。优点是节省内存和磁盘空间,缺点是运行速度稍慢。

制作动态库
  1. 编译源文件生成动态库(.so文件):
    gcc -shared -fPIC calcufuncs.c -o libcalc.so
使用动态库
  1. 编译时指定库文件路径和库名:
    gcc calculatorT.c -lcalc -L ./ -o mainProDy

  2. 运行时指定动态库路径:
    export LD_LIBRARY_PATH="/home/pi/back/test" ./mainProDy

示例代码

network.c
#include "network.h" 
#include <stdio.h>
 
void init_network() 
{ 
    printf("Network initialized.\n"); 
}
network.h
#ifndef NETWORK_H 
#define NETWORK_H 

void init_network(); 
#endif

#include "ultrasonic.h" 
#include <stdio.h> 

void init_ultrasonic() 
{ 
       printf("Ultrasonic sensor initialized.\n"); 
}
ultrasonic.h
#ifndef ULTRASONIC_H 
#define ULTRASONIC_H 

void init_ultrasonic(); 

#endif

motor.c
 
#include "motor.h" 
#include <stdio.h> 

void init_motor() 
{ 

    printf("Motor initialized.\n"); 
}

motor.h
 
#ifndef MOTOR_H 
#define MOTOR_H 

void init_motor(); 

#endif

main.c
#include "network.h" 
#include "ultrasonic.h" 
#include "motor.h" 

int main() { init_network(); 
init_ultrasonic(); init_motor(); 

return 0; 
Makefile
# Variables CC = gcc CFLAGS = -Wall -fPIC LDFLAGS = -shared 

# Source files SRC = network.c ultrasonic.c motor.c 

OBJ = $(SRC:.c=.o) STATIC_LIB = libmylib.a DYNAMIC_LIB = libmylib.so 

# Targets .PHONY: all static dynamic clean all: static dynamic static: $(OBJ) ar rcs 

$(STATIC_LIB) $(OBJ) dynamic: $(SRC) $(CC) $(CFLAGS) $(LDFLAGS) -o $(DYNAMIC_LIB) $(SRC) 

clean: rm -f $(OBJ) $(STATIC_LIB) $(DYNAMIC_LIB)

参考文献

  1. Linux中的库
  2. CSDN博客 - Linux 内库

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

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

相关文章

走进开源企业 | 湖南大学OpenHarmony技术实训活动在开鸿智谷顺利举办!

6月24日-6月26日&#xff0c;2024开放原子校源行之湖南大学信息科学与工程学院师生走进开源企业实训交流活动顺利落下帷幕。湖南大学信息科学与工程学院的师生代表团一行90人参与了湖南开鸿智谷数字产业有限公司&#xff08;以下简称“开鸿智谷”&#xff09;与母公司拓维信息系…

从BeanFactory源码看Bean的生命周期

下图是我搜索“Spring Bean生命周期”找到的图片&#xff0c;来自文章——Spring Bean的生命周期 [](https://img2022.cnblogs.com/blog/1942408/202207/1942408-20220713150530777-1198523052.png) 下面&#xff0c;我们从AbstractAutowireCapableBeanFactory的源码中来分析…

深度学习笔记: 最详尽解释预测系统的分类指标(精确率、召回率和 F1 值)

欢迎收藏Star我的Machine Learning Blog:https://github.com/purepisces/Wenqing-Machine_Learning_Blog。如果收藏star, 有问题可以随时与我交流, 谢谢大家&#xff01; 预测系统的分类指标(精确率、召回率和 F1 值) 简介 让我们来谈谈预测系统的分类指标以及对精确率、召回…

【最新综述】医学图像分割深度半监督学习(下)

GAN-based methods 生成方法可以从数据中挖掘隐藏特征,并根据训练获得的真实数据分布生成新的数据分布(Goodfellow 等人,2020 年)。本节主要介绍基于生成对抗网络(GAN)的深度半监督医学图像分割方法。GAN 是一种流行的无监督学习技术,它对数据的高维分布进行隐式建模,包…

【源码+文档+调试讲解】基于vue的线上点餐系统

摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了线上点餐系统的开发全过程。通过分析线上点餐系统管理的不足&#xff0c;创建了一个计算机管理线上点餐系统的方案。文章介绍了线上点餐系统的系统分析部分&…

.net 8 集成 MinIO文件存储服务,实现bucket管理,以及文件对象的基本操作

一、准备工作 1、本地部署MinIO服务 2、创建MinIO的Access Key 3、创建.net 项目 4、下载MinIO sdk 5、相关文档 二、编写MinIO工具类 三、管理存储桶 1、MyBucket类 &#xff08;1&#xff09;判断bucket是否存在 &#xff08;2&#xff09;新建bucket &#xff08…

CST电磁仿真软件在兼容方向的应用

电磁兼容仿真 这篇文章主要讲述了CST在电磁兼容领域的应用。实践表明&#xff0c;发现产品的电磁兼容问题越早&#xff0c;解决问题所需的时间和成本就会越少&#xff0c;也就越容易解决电磁兼容问题。 CST电磁仿真软件针对系统设计中的诸多问题&#xff0c;例如PCB板级EMC、线…

生产环境 CentOS 7 k8s v1.28.0离线部署

背景描述&#xff1a;CentOS 7 Kubernetes 离线部署 随着云计算和微服务架构的普及&#xff0c;Kubernetes&#xff08;K8s&#xff09;已经成为容器编排的标准工具。它能够自动化应用的部署、扩展和管理&#xff0c;使得开发和运维的工作更加高效和可靠。然而&#xff0c;在一…

【MySQL备份】Percona XtraBackup全量备份实战篇

目录 1. 前言 2.准备工作 2.1.环境信息 2.2.创建备份目录 2.3.配置/etc/my.cnf文件 2.4.授予root用户BACKUP_ADMIN权限 3.全量备份 4.准备备份 5.数据恢复 6.总结 "实战演练&#xff1a;利用Percona XtraBackup执行MySQL全量备份操作详解" 1. 前言 本文…

【文末赠书13】推荐系统中冷启动环节的设计实现

【文末赠书13】《智能网联汽车&#xff1a;激光与视觉SLAM详解》 写在最前面写在最前面推荐系统中的冷启动1、用户冷启动2、物料冷启动3、PID算法 《推荐系统全链路设计&#xff1a;原理解读与业务实践》内容简介&#xff1a; &#x1f308;你好呀&#xff01;我是 是Yu欸 &am…

分享3个AI工具-包括自学AI文档和AI搜索和智能体

文章目录 通往AGI之路-自学神器秘塔AI扣子 通往AGI之路-自学神器 这是是一个有关AI知识的开源文档。 但是&#xff0c;我认为这是小白学习AI的最强王者&#xff0c;每一个想学习AI、想使用AI的人都可以把它设为首页&#xff0c;从它开始。 飞书文档&#xff1a;通往AGI之路 …

如何实现公网环境远程连接本地局域网宝塔FTP服务远程管理文件

文章目录 前言1. Linux安装Cpolar2. 创建FTP公网地址3. 宝塔FTP服务设置4. FTP服务远程连接小结 5. 固定FTP公网地址6. 固定FTP地址连接 &#x1f4a1;推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。…

基于IIS的Windows系统Django项目本地部署

参考&#xff1a; 1. 基于Windows平台的Django本地部署和腾讯云服务器上部署&#xff08;1&#xff09;_如何在服务器上发布部署django程序 csdn-CSDN博客 2.Windows server iis部署Django详细操作 - Django中文 - 博客园 (cnblogs.com) 3.在IIS中部署pythonDjango项目时出…

基于大语言模型的本地知识库问答(离线部署)

一、前言 知识库问答是一种应用广泛的系统&#xff0c;可以在许多领域发挥重要作用。不过以往的系统通常是基于固定规则、相似度检索或者seq2seq模型&#xff0c;这类系统开发成本较高、修改也较为麻烦&#xff0c;尤其在数据准备过程需要耗费大量精力。 而大语言模型&#x…

事务的影子拷贝-系统架构师(二十)

1、&#xff08;重点&#xff09;企业信息集成按照组织范围分为企业内部的信息集成和外部信息集成。在企业内部信息集成中&#xff0c;&#xff08;&#xff09;实现了不同系统之间的互操作&#xff0c;使的不同系统之间能够实现数据和方法的共享。&#xff08;&#xff09;实现…

基于Java的外卖点餐系统设计与实现

作者介绍&#xff1a;计算机专业研究生&#xff0c;现企业打工人&#xff0c;从事Java全栈开发 主要内容&#xff1a;技术学习笔记、Java实战项目、项目问题解决记录、AI、简历模板、简历指导、技术交流、论文交流&#xff08;SCI论文两篇&#xff09; 上点关注下点赞 生活越过…

Linux\ubuntu系统下载中文输入法

目录 1 系统图形化安装 1.1 打开设置 1.2 选择语言 1.3 选择简体中文 1.4 再次打开设置 1.5 选择中文 1.6 退出即可安装成功 本文主要记述在ubuntu1806下安装中文输入法的过程&#xff0c;其实Ubuntu上可以安装的中文输入法有很多种&#xff0c;可以直接通过系统安装&am…

周界入侵自动监测摄像机

当今&#xff0c;随着科技的快速发展&#xff0c;周界入侵自动监测摄像机作为安全监控领域的重要创新&#xff0c;正逐渐成为各类场所安全防范的核心设备。这种摄像机以其先进的监测和预警功能&#xff0c;有效提升了安全管理的效率和实时响应能力&#xff0c;被广泛应用于各类…

什么是屎山代码?

为什么说再厉害的程序员&#xff0c;也怕屎山代码&#xff1f; 首先&#xff0c;屎山代码不是指的一种开发语言&#xff0c;而是对庞大项目的一个别称。 常言道&#xff0c;屎山传万代&#xff0c;代代不吱声。每次传承都会遗留大量问题&#xff0c;接手的人一般都不敢动代码&a…

JSONpath语法怎么用?

JSONPath 可以看作定位目标对象位置的语言&#xff0c;适用于 JSON 文档。 JSONPath 与 JSON 的 关系相当于 XPath 与 XML 的关系&#xff0c; JSONPath 参照 XPath 的路径表达式&#xff0c;提供了描述 JSON 文档层次结构的表达式&#xff0c;通过表达式对目标…