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

news2024/12/25 0:22:15

一、分文件编程

  简单来说树莓派的分文件编程就是将一个项目的代码放在不同的文件里面,然后在主函数添加一个头文件,这样会使#控制字体颜色主程序变得简单
在编译的时候要将主函数和功能函数一起编译:
在这里插入图片描述
注意: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.coloradmin.cn/o/66151.html

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

相关文章

01 Java语言简介

0 警告 Java从入门到放弃。 1.1概述 Java 语言是 SUN&#xff08;Stanford University Network&#xff0c;斯坦福大学网络公司&#xff09;于 1995 年推出的一门高级编程语言。 Java 语言是一种面向 Internet 的编程语言。Java 一开始富有吸引力是因为 Java 程序可以在 Web 浏…

面向碳中和的公共建筑室内环境营造再认识

3月26日&#xff5c;清华大学建筑节能学术周——公共建筑节能—工程实践助力实现双碳目标 【3月26日公开论坛】公共建筑节能 – 工程实践助力实现双碳目标 面向碳中和的公共建筑室内环境营造再认识 对“舒适”、“健康”和室内环境营造手段的再认识 1.对“舒适”的再认识 P…

luckysheet 国产超强纯前端在线excel表格功能强大 简单使用记录 异常报错记录及处理

效果预览 官网及在线示例 https://mengshukeji.gitee.io/LuckysheetDocs/zh/guide/ npm地址 https://www.npmjs.com/package/luckysheet 在线效果 https://mengshukeji.gitee.io/luckysheetdemo/ 在线导入效果 https://mengshukeji.gitee.io/luckyexceldemo/ 使用步骤 两…

单片机硬件和软件延时是啥意思?

软件延时和硬件延时是啥意思&#xff1f;做项目时他俩有什么区别&#xff1f; 今天就来讲讲关于硬件延时和软件延时的内容&#xff0c;以及它们的区别。 硬件和软件延时 延时的种类很多&#xff0c;先给大家普及一下延时相关概念和分类。 1.硬件延时 指利用具有计数功能的…

【学习笔记】空间坐标系旋转与四元数

前言 最近在学惯性器件&#xff0c;想着先把理论知识脉络打通&#xff0c;于是便开始学习空间坐标系旋转和四元数&#xff0c;正好结合刚刚结课的课程《机器人控制技术》&#xff0c;记录一下学习心得。 旋转矩阵和齐次变换矩阵部分主要参考自教材 《机器人学导论》 中的第2章 …

SD NAND 的 SDIO在STM32上的应用详解(中篇)

四.SDIO功能框图(重点) SDIO包含2个部分&#xff1a; ● SDIO适配器模块&#xff1a;实现所有MMC/SD/SD I/O卡的相关功能&#xff0c;如时钟的产生、命令和数据的传送。 ● AHB总线接口&#xff1a;操作SDIO适配器模块中的寄存器(由STM32控制SDIO外设)&#xff0c;并产生中断和…

四种区块链底层技术形态的对比解读

新世纪以来&#xff0c;互联网技术快速发展&#xff0c;催生了以平台经济为典型的各种新业态、新模式&#xff0c;深刻影响和改变了人类社会的生产方式、生活方式和社会治理方式。然而在推动经济和社会发展的同时&#xff0c;基于数据点对点传输建立的互联网也越来越多地暴露出…

可以作为艺术作品欣赏的CT三维重建技术。

什么是CT三维重建技术&#xff1a;简而言之就是通过螺旋CT自带的计算机软件&#xff0c;对扫描获得的数据进行后处理&#xff0c;以达到辅助医生对病变和周围组织&#xff0c;及其与血管的关系进行分析和显示的目的&#xff0c;它极大地提高了影像诊断的直观性&#xff0c;准确…

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

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

大数据学习:使用Vim编辑器

文章目录一、安装Vim编辑器二、切换三种工作模式1、命令模式2、输入模式3、末行模式三、案例演示1、将第一行内容复制粘贴到第二行之后2、删除第二行内容四、末行模式中基本操作1、案例演示任务一&#xff1a;显示行号任务二&#xff1a;取消行号任务三&#xff1a;存盘退出&am…

【教程】Derby数据库安装与使用

前言 环境配置只是开始&#xff0c;代码上的创作才是灵魂。 JDK版本&#xff1a;1.8.0_341 Derby版本&#xff1a;10.14.2.0 一、Derby安装 1. 打开 cmd 键盘按下 Windows R 打开本地 cmd &#xff08;命令提示符&#xff09;或 windows powershell 。 2. 查询 jdk 版本 输…

基于ARM架构openEuler系统通过qemu模拟器自动安装启动ARM架构的openEuler虚拟机

【原文链接】基于ARM架构openEuler系统通过qemu模拟器自动安装启动ARM架构的openEuler虚拟机 文章目录一、基础准备工作二、自动创建基于dhcp自动获取ip地址的openEuler虚拟机三、自动创建配置静态IP地址的openEuler虚拟一、基础准备工作 &#xff08;1&#xff09;下载ARM架构…

听话的苹果-第11届蓝桥杯Scratch选拔赛真题精选

[导读]&#xff1a;超平老师计划推出Scratch蓝桥杯真题解析100讲&#xff0c;这是超平老师解读Scratch蓝桥真题系列的第96讲。 蓝桥杯选拔赛每一届都要举行4~5次&#xff0c;和省赛、国赛相比&#xff0c;题目要简单不少&#xff0c;再加上篇幅有限&#xff0c;因此我精挑细选…

三车道交通流元胞自动机研究(matlab代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客 &#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜…

RK3288-开机电流声-SPK

开机的时候明显听到爆炸电流声 然后关闭开机铃声后发现触摸的第一下有爆炸电流声 然后思路就是去掉电流声 然后我的方法是开机让使能脚为低,开机之后等开机铃声触发掉爆炸电流声后在使能, spk_con_gpio=<&gpio7 15 GPIO_ACTIVE_HIGH>; DTS匹配上先置低电平 UBOO…

毕业设计 大数据商城人流数据分析与可视化 - python 大数据分析

文章目录0 前言课题背景分析方法与过程初步分析&#xff1a;总体流程&#xff1a;1.数据探索分析2.数据预处理3.构建模型总结最后0 前言 &#x1f525; 这两年开始毕业设计和毕业答辩的要求和难度不断提升&#xff0c;传统的毕设题目缺少创新和亮点&#xff0c;往往达不到毕业…

了解Docker 依赖的linux内核技术

深入理解SR-IOV和IO虚拟化 一文了解Linux上TCP的几个内核参数调优 一文剖析Linux内核中内存管理 分析linux启动内核源码 一文剖析Linux内核中内存管理 NamespaceCgroupUnionFS docker 的实现&#xff0c;主要依赖 linux 的 namespace、cgroup 和 unionFS 三种技术实现&#xf…

【学习笔记】Python+request+Unittest接口测试入门

PythonrequestUnittest接口测试入门 接口测试流程 1.需求分析&#xff08;产品经理的需求文档&#xff09; 2.接口文档解析&#xff08;开发编写的接口API文档&#xff09; 3.设计接口测试用例&#xff08;编写Excel表格形式的用例&#xff09; 4.准备接口测试脚本&#xff1…

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

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

线段树模板(Java)

线段树一、线段树概念二、线段树模板1.建树2. 单点修改3.区间查询4.完整代码及测试一、线段树概念 线段树是一种二叉搜索树&#xff0c;与区间树相似&#xff0c;它将一个区间划分成一些单元区间&#xff0c;每个单元区间对应线段树中的一个叶结点。它的主要优势是对于区间求和…