【Linux|树莓派】分文件编程以及静态库动态库

news/2024/5/6 2:32:31/文章来源:https://blog.csdn.net/qq_46249312/article/details/128167062

一、分文件编程

  简单来说树莓派的分文件编程就是将一个项目的代码放在不同的文件里面,然后在主函数添加一个头文件,这样会使#控制字体颜色主程序变得简单
在编译的时候要将主函数和功能函数一起编译:
在这里插入图片描述
注意:include <stdio.h>include "calculatorfuncs.h" 的区别:
  前者表示引用标准库的头文件,编译时会从系统配置的库环境中去寻找,后者一般为用户自定义的头文件,比如分文件编程中自己定义的头文件,编译系统会从当前文件夹去寻找,如果找不到,则到系统的库文件中去寻找。

Linux中C/C++默认库环境:/usr/include,可使用ls /usr/include 查看。
在这里插入图片描述

二、linux库

使用GNU的工具我们如何在Linux下创建自己的程序函数库?
一个“程序函数库”简单的说就是一个文件包含了一些编译好的代码和数据,这些编译好的代码和数据可以在事后供其他的程序使用。程序函数库可以使整个程序更加模块化,更容易重新编译,而且更方便升级

程序函数库可分为3种类型:静态函数库(static libraries)、共享函数库(shared libraries)、动态加载函数库(dynamically loaded libraries):

  • 静态函数库是在程序执行前就加入到目标程序中去了 ;
  • 动态函数库同共享函数库是一个东西(在linux上叫共享对象库, 文件后缀是.so ,windows上叫动态加载函数库, 文件后缀是.dll)

Linux中命名系统中共享库的规则:
在这里插入图片描述

1、静态库优缺点

静态库在程序执行(编译)前就加入到目标程序中去了。
优点:
1.静态库被打包到应用程序中加载速度快
2.发布程序无需提供静态库,因为已经在app中,移植方便
缺点:
1.链接时完整地拷贝至可执行文件中,被多次使用就有多份冗余拷贝。
2.更新、部署、发布麻烦。
在这里插入图片描述
简单来说,优点: 运行快,发布程序无需提供静态库,因为已经在app中,移植方便;
缺点:程序大,链接时完整的拷贝到执行文件中,会有多份冗余拷贝,更新部署麻烦。

2、动态库优缺点

动态函数库是在程序执行时动态(临时)由目标程序去调用。
优点:
1.链接时不复制,程序运行时由系统动态加载到内存,供程序调用,系统只加载一次,多个程序可以共用,节省内存。
2.程序升级简单,因为app里面没有库的源代码,升级之后只要库的名字不变,函数名以及参数不变,只是实现做了优化,就能加载成功。
缺点:
1.加载速度比静态库慢
2.发布程序需要提供依赖的动态库
在这里插入图片描述
简单来说,优点:程序小,链接时不用复制,程序运行时由系统动态加载到内存中,系统只加载一次,供多个程序共用,节省空间,程序升级简单,升级后只要库名字,函数名以及参数不变,只是做了优化就能加载成功。
缺点:运行慢,加载速度比静态库慢,发布程序需要提供依赖的动态库。

三、库的制作和使用

1、静态库制作和使用

静态库格式:libxxx.a
制作:

$gcc name.c -c
$ar rcsv libname.a name.o
a - name.o

编译:
链接到刚刚生成的静态库libname.a

$gcc test.c -lname -L./ -o mainStatic
./mainStatic

-lname(-l后加libname.a掐头去尾)
-L是告诉gcc编译器从-L制定的路径去找静态库(这里指定gcc编译器先从当前路径去找静态库),不用-L的话就会从默认的/usr/lib 或者/usr/local/lib路径去找静态库。
在这里插入图片描述

2、动态库制作和使用

动态库格式:libxxx.so
制作:

$gcc -shared -fpic name.c -o libname.so

-shared 指定生成动态库
-fpic 标准,fPIC 选项作用于编译阶段,在生成目标文件时就得使用该选项,以生成位置无关的代码
编译:

$gcc test.c -lname -L./ -o mainDynamic
./mainDynamic

在这里插入图片描述
注意:
动态库这里直接./mainDynamic运行的话会出错,因为动态函数库是在程序执行时(临时)由目标程序去调用,所以这里会出错。

  • 方法一:在配置文件/etc/ld.so.conf中指定动态库搜索路径
    vi /etc/ld.so.conf添加 lib目录
    在这里插入图片描述
    修改后需要运行ldconfig命令。
  • 方法二:通过环境变量LD_LIBRARY_PATH指定动态库搜索路径(临时的使用
    export LD_LIBRARY_PATH="/home/pi/STUDY/library"
    在这里插入图片描述
    a.为了可以在多个窗口都可以使用动态库,可以写一个shell脚本来实现
    export LD_LIBRARY_PATH="/home/pi/STUDY/library"
    ./mainDynamic
    在这里插入图片描述
    b.给shell脚本添加可执行的权限
    chmod +x start.sh
    在这里插入图片描述
  • 方法三:直接将库文件复制到/lib或则/user/lib目录下
    sudo cp libcalculatorfuncs.so /user/lib
    在这里插入图片描述

参考:
1、Linux共享库、静态库、动态库详解
2、Linux中的库

最后谢谢阅读,笔者乃小白,如有错误之处还请指正。

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

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

相关文章

Matplotlib入门[04]——处理图像

Matplotlib入门[04]——处理图像 参考&#xff1a; https://ailearning.apachecn.org/Matplotlib官网 图片来源&#xff1a;百度&#xff08;如有侵权&#xff0c;立删&#xff09; 使用Jupyter进行练习 import matplotlib.pyplot as plt import matplotlib.image as mpimg imp…

【Java学习Note】第8章 多线程

8. 多线程 文章目录8. 多线程8.1 程序、进程、线程8.2 线程的创建8.2.1 继承Thread类-创建线程方法之一8.2.2 Thread常用方法8.2.3 实现Runnable接口-创建线程方法之二8.2.4 两种多线程的区别8.3 线程得调度8.4 线程的生命周期8.5 线程的同步8.5.1 线程同步--Synchronized8.5.2…

CUDA入门和网络加速学习(一)

0. 简介 最近作者希望系统性的去学习一下CUDA加速的相关知识&#xff0c;正好看到深蓝学院有这一门课程。所以这里作者以此课程来作为主线来进行记录分享&#xff0c;方便能给CUDA网络加速学习的萌新们去提供一定的帮助。 1. GPU与CPU区别 处理器指标一般主要分为两大类&…

使用react-grid-layout和react-full-screen实现一个可自定义和全屏展示的dashboard页面

文章目录使用react-grid-layout和react-full-screen实现一个可自定义和全屏展示的dashboard页面具体实现代码展示主展示页面懒加载组件组件加载时展示的组件dashboard菜单组件具体的图表组件Demo演示使用react-grid-layout和react-full-screen实现一个可自定义和全屏展示的dash…

【微服务】SpringCloud中OpenFeign请求处理及负载均衡流程

&#x1f496; Spring家族及微服务系列文章 ✨【微服务】SpringCloud中Ribbon的WeightedResponseTimeRule策略 ✨【微服务】SpringCloud中Ribbon的轮询(RoundRobinRule)与重试(RetryRule)策略 ✨【微服务】SpringCloud中Ribbon集成Eureka实现负载均衡 ✨【微服务】SpringCloud…

EMQ 宣布推出 LF Edge eKuiper 全新 Logo 标识

全球领先的开源物联网数据基础设施软件供应商 EMQ 映云科技宣布,即日起,将正式启用全新的 LF Edge eKuiper(以下简称 eKuiper)产品 Logo。焕然一新的 eKuiper 产品 Logo 标志着 EMQ 在不断提升品牌全球化战略之上,对于打造高性能、高可用、高安全的世界级开源软件产品的极致追求…

【1805. 字符串中不同整数的数目】

来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 描述&#xff1a; 给你一个字符串 word &#xff0c;该字符串由数字和小写英文字母组成。 请你用空格替换每个不是数字的字符。例如&#xff0c;"a123bc34d8ef34" 将会变成 " 123 34 8 34" 。注意…

面试题: LEAD 和 LAG 求每个用户的页面停留时长

我们先来看看这两个函数的语法&#xff1a; LEAD(col,n,default) OVER() 说明&#xff1a; 用于统计窗口内向下第n行的值参数1&#xff1a; 为要取值的列名参数2&#xff1a; 为向下第n行&#xff0c;默认值为1&#xff0c;这个值是固定的&#xff0c;不能动态的变化参数3&am…

深度学习-全卷积神经网络(FCN)

1. 简介 全卷积神经网络&#xff08;Fully Convolutional Networks&#xff0c;FCN&#xff09;是Jonathan Long等人于2015年在Fully Convolutional Networks for Semantic Segmentation一文中提出的用于图像语义分割的一种框架&#xff0c;是深度学习用于语义分割领域的开山之…

国际学校妈妈哭诉IB太难:中国孩子都不知道怎么答题?

听别人说考国际学校的IB体系相对简单直到我看到IB试题才知道其实IB一点都不容易特别对于中国学生有大量写论文的部分来看看IB的真题有些学生真的很难下笔不知道怎么答题啊&#xff01;商科生物 题目都是非常考验综合能力的&#xff0c;学生需要掌握很多知识点并融会贯通&#x…

cengbox2靶机(hydra爆破、公私钥免密登录)

环境准备 靶机链接&#xff1a;百度网盘 请输入提取码 提取码&#xff1a;zdpr 虚拟机网络链接模式&#xff1a;桥接模式 攻击机系统&#xff1a;kali linux 2021.1 信息收集 1.arp-scan -l探测目标靶机ip 2.nmap -p- -A -T4 192.168.1.107 探测目标靶机开放端口和服务 …

Locust学习记录5-任务属性【Task】

Task 当负载测试开始时&#xff0c;将为每个模拟用户创建一个User类的实例&#xff0c;他们将开始在自己的绿色线程中运行。当这些用户运行时&#xff0c;他们选择他们执行的任务&#xff0c;休眠一段时间&#xff0c;然后选择一个新任务。 这些任务时普通的python可调用文件…

服务访问质量(QoS)介绍与技术 一

个人简介&#xff1a;云计算网络运维专业人员&#xff0c;了解运维知识&#xff0c;掌握TCP/IP协议&#xff0c;每天分享网络运维知识与技能。个人爱好: 编程&#xff0c;打篮球&#xff0c;计算机知识个人名言&#xff1a;海不辞水&#xff0c;故能成其大&#xff1b;山不辞石…

K8S Pod控制器详细讲解

文章目录一、Pod控制器介绍二、ReplicaSet(RS)三、Deployment(Deploy)1.镜像更新&#xff1a;2.版本回退3.金丝雀发布/灰度发布四、Horizontal Pod Autoscaler(HPA)五、DaemonSet(DS)六、Job七、CronJob(CJ)结尾一、Pod控制器介绍 Pod是kubernetes的最小管理单元&#xff0c;在…

使用JAR签名进行代码签名

JavaArchive(JAR)包格式可用于打包Java应用程序和库。 签名的JAR文件可以选择包含来自TSA时间戳响应&#xff0c;使用RFC#3161格式。 添加JAR签名者添加JAR签名者的链接&#xff0c;SignServer中的JAR签名器称为JArchiveSigner。 要配置JArchiveSigner&#xff0c;请按照以下…

用代码画两棵圣诞树送给你【附详细代码】

大家好&#xff0c;我是宁一 代码的魔力之处在于&#xff0c;可以帮我们实现许多奇奇怪怪、有趣的想法。 比如&#xff0c;用Python的Turtle库&#xff0c;可以帮我们在电脑上画出好看的图像。 下面这张樱花图就是用Turtle库实现的。 这不圣诞节快到啦。 那么就用代码来画一…

jsp servlet mysql实现的二手车汽车管理系统项目源码附带视频指导运行教程

今天给大家演示一下由jsp servlet mysql实现的一款简单的二手车汽车管理系统&#xff0c;系统设计采用了mvc分层的模式&#xff0c;结构非常清晰&#xff0c;功能虽简单&#xff0c;但是把所有可能用到的功能都实现了&#xff0c;往上面添加功能很简单&#xff0c;直接复制代码…

计算机网络学习笔记(Ⅲ):数据链路层

目录 1 数据链路层概述 1.1 基本概念 1.2 主要功能 2 封装成帧和透明传输 2.1 封装成帧 2.2 透明传输 1.字符计数法 2.字符填充法 3.零比特填充法 4.违规编码法 3 差错控制 3.1 差错 3.1 检错编码 1.奇偶校验码 2.CRC循环冗余码 3.2 纠错编码 1.确定校验码位数…

docker安装nginx代理nacos2.1.2版本集群

目录 安装docker最新版本 创建一个docker network&#xff0c;使之固定docker局域ip docker安装mysql主从 配置挂载的my.cnf配置文件 进入mysql主数据库容器命令 登录主数据库创建用于从数据连接主数据的账号密码 输入show master status;查看master数据库状态 在从数据库…

关于JVM:内容以及流程释义

对于JVM、GC、类加载&#xff0c;很多人摸不清楚头绪&#xff0c;不知道他们之间的关系。误以为GC和类加载还有JVM区分统称垃圾回收&#xff0c;实则他们包含的东西很多&#xff0c;很细&#xff0c;完整的了解正个JVM的加载过程&#xff0c;就需要全面理解这些东西。 我认为的…