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 内库

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

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

相关文章

三、c++ qt 实现一个基于tcp的Session

在Qt框架下实现一个基于TCP的Session管理,你可以利用Qt的网络模块QTcpServer和QTcpSocket。下面是一个简单的示例,展示了如何建立一个服务器,接收客户端连接,并为每个连接的客户端创建一个Session对象来管理会话。 首先,你需要包含必要的Qt头文件,并定义一个TcpSession类…

C++左值/右值/左值引用/右值引用

1&#xff09;C入门级小知识&#xff0c;分享给将要学习或者正在学习C开发的同学。 2&#xff09;内容属于原创&#xff0c;若转载&#xff0c;请说明出处。 3&#xff09;提供相关问题有偿答疑和支持。 左值和右值的概念&#xff1a; 早期的c语言中关于左值和右值的定义&a…

Kithara常见问题解答

目录 通用问题我的内核驱动程序已经签名了吗&#xff1f;是否可以在打开驱动程序时防止显示介绍窗口&#xff1f;Windows 7 仍然支持吗&#xff1f;错误0x10142422(KSERROR_CANNOT_START_KERNEL)在KS_openDriver时出现&#xff1f;错误 10145241 (KSERROR_CANNOT_START_KERNEL)…

低代码开发技术助力企业数字化管理的实践探究

随着信息技术的飞速发展&#xff0c;企业对于数字化管理的需求日益迫切。而低代码开发技术&#xff0c;以其高效、灵活、易用的特点&#xff0c;正逐渐成为企业数字化管理的重要工具。本文将进一步探讨低代码开发技术在企业数字化管理实践中的应用及其带来的变革。 低代码开发技…

每日一题——Python实现PAT乙级1026 程序运行时间(举一反三+思想解读+逐步优化)五千字好文

一个认为一切根源都是“自己不够强”的INTJ 个人主页&#xff1a;用哲学编程-CSDN博客专栏&#xff1a;每日一题——举一反三Python编程学习Python内置函数 Python-3.12.0文档解读 目录 我的写法 代码结构和逻辑 时间复杂度 空间复杂度 代码优化建议 总结 我要更强 …

交换机需要多大 buffer

有点违背直觉&#xff0c;但是真事儿&#xff0c;交换机过境的流越多&#xff0c;所需 buffer 越小&#xff0c;这是为什么&#xff1f; 范氏(范雅各布森&#xff0c;van jacobson)管道的 aimd 流建议 buffer_size 为 bdp&#xff0c;这很容易理解&#xff0c;因为 aimd 流最小…

【mybatis】spring boot框架中使用mybatis-plus配置多数据源

1、简介 在Java开发中&#xff0c;当使用MyBatis-Plus进行数据库操作时&#xff0c;可能会遇到需要配置多数据源的场景&#xff0c;比如读写分离、操作多个数据库等。MyBatis-Plus本身是基于MyBatis的增强工具&#xff0c;它并没有直接提供多数据源的配置支持&#xff0c;但可…

k8s nfs配置mysql,redis

1.安装nfs # centos yum install nfs-utils -ysudo mkdir -p /nfs/mysql sudo chmod 777 /nfs/mysqlsudo mkdir -p /nfs/redis sudo chmod 777 /nfs/redisvim /etc/exports/nfs/mysql *(rw,sync,no_root_squash) /nfs/redis *(rw,sync,no_root_squash)sudo exportfs -asystemc…

币界网讯,预计以太坊现货 ETF 将于 7 月中旬推出

刚刚 ETF Store 总裁 Nate Geraci 在 X &#xff08;前Twitter&#xff09;平台上宣布&#xff0c;备受数字货币市场期待的SEC以太坊现货 ETF提案&#xff0c;将于7 月中旬通过美国证券交易委员会&#xff08;SEC&#xff09;批准。Nate Geraci透露修订后的 S-1 文件将于 7 月 …

cannot import name ‘LineString‘ from ‘shapely‘

cannot import name LineString from shapely pip install shapely -U 升级到2.0后好像好了

【VUE】 深入理解 Vue 动态路由:简介、实际开发场景与代码示例

深入理解 Vue 动态路由&#xff1a;简介、实际开发场景与代码示例 Vue.js 是一个用于构建用户界面的渐进式框架&#xff0c;它拥有丰富的生态系统&#xff0c;其中 Vue Router 是其官方的路由管理库。动态路由是 Vue Router 的一个强大特性&#xff0c;允许我们在应用运行时根…

pnpm的坑

请问pnpm的两个坑怎么解决&#xff1a; 第一个坑&#xff1a;没有节省磁盘空间 我已经配置了依赖的存储位置&#xff0c; 但我在项目里pnpm install以后&#xff0c;发现依赖包还是很大&#xff0c; 然后发现里面的链接并不是指向先前配置的依赖存储位置&#xff0c;而是指…

【数智化人物展】袋鼠云CEO宁海元:大模型时代,Data+AI将成为新的基础设施

宁海元 本文由袋鼠云CEO宁海元投递并参与由数据猿联合上海大数据联盟共同推出的《2024中国数智化转型升级先锋人物》榜单/奖项评选。 大数据产业创新服务媒体 ——聚焦数据 改变商业 身处这个瞬息万变的数字经济时代&#xff0c;传统的生产模式往往依赖于经验和固定的流程&…

上海市计算机学会竞赛平台2023年2月月赛丙组圆环三染色

题目描述 有一个圆环上有 &#x1d45b;n 个点&#xff0c;一个染色方案需要为每个点分配三种颜色中的一种&#xff0c;且圆环上相邻的点颜色不能相同。 请求出有多少种染色方案。答案可能很大&#xff0c;输出模 1,000,000,0071,000,000,007 的余数。 输入格式 单个整数表…

k8s-第六节-数据持久化

数据持久化 kubernetes 集群不会为你处理数据的存储&#xff0c;需要为数据库挂载一个磁盘来确保数据的安全。 可以选择云存储、本地磁盘、NFS。 本地磁盘&#xff1a;可以挂载某个节点上的目录&#xff0c;但是这需要限定 pod 在这个节点上运行 云存储&#xff1a;不限定节…

GEE计算遥感生态指数RESI

目录 RESI湿度绿度热度干度源代码归一化函数代码解释整体的代码功能解释:导出RSEI计算结果参考文献RESI RSEI = f (Greenness,Wetness,Heat,Dryness)其遥感定义为: RSEI = f (VI,Wet,LST,SI)式中:Greenness 为绿度;Wetness 为湿度;Thermal为热度;Dryness 为干度;VI 为植被指数…

文心一言指令:快速入门手册

文心一言&#xff08;Wenxin Yiyan&#xff09;是百度推出的一款人工智能语言模型&#xff0c;能够生成自然语言内容&#xff0c;回答问题&#xff0c;进行翻译等多种任务。以下是详细的文心一言指令使用指南&#xff0c;帮助您快速上手。 目录 简介注册与登录接口调用常用指…

手写starter核心思路流程-全网最详细版本

全网最详细手写starter组件教程 那么在写这篇博客之前,先问一下大家为什么要写starter组件,仅仅只是为了炫技吗?还是真正的在业务中需要.在现在的开发环境下,什么是竞争力? 举例分页查询来说,每个来公司的程序员都有一套自己写分页的流程,但是这套流程基本上都是重复的,那么…

Docker学习笔记(一)概念理解

一、什么是docker容器 Docker容器是一种轻量级、可移植的软件封装技术&#xff0c;它允许开发者将应用程序及其依赖、配置文件、运行环境等打包到一个独立的、自包含的执行单元中。容器与虚拟机相似&#xff0c;都提供了隔离的运行环境&#xff0c;但容器更加轻量级&#xff0c…

如何清理电脑内存?让电脑运行如飞!

电脑内存&#xff08;RAM&#xff09;的清理对于维持系统的流畅运行至关重要。随着使用时间的增加&#xff0c;系统内存会被各种应用程序和后台进程占用&#xff0c;导致系统响应变慢&#xff0c;甚至出现卡顿现象。通过有效地清理内存&#xff0c;可以提升电脑的性能&#xff…