Linux动态库和静态库

1,手动制作静态库

1,如何形成静态库文件

做库时,头文件(.h)必须暴露,源文件(.c)必须隐藏。

操作:将需要形成库的文件编译成.o文件:

然后用指令:ar -rc libmy_stdio.a my_stdio.o my_string.o

其中,如果形成库文件前缀必须是lib,后缀必须是.a,后面可以加版本号。

这时候就可以把头文件和库文件交给另外一个人使用。

2,如何使用静态库

a,在系统层面导入库文件

首先拿到别人给的头文件和库文件,我们需要去系统路径下安装别人给的头文件和库文件:

安装头文件:sudo cp*.h /usr/include/

安装库文件:sudo cp libmy_stdio.a /lib64/

这个时候在c文件里包头文件就可以找得到库文件:

                  

下面编译一下利用别人库函数的文件:

这个时候发现会报错,因为gcc只认自己的标准库,我们写的库属于第三方文件,gcc不认识,这时候要让gcc找到可以用指令:

gcc main.c -l my_stdio(注意!!!这里要去掉库文件的前缀和后缀)

可以看到这时候编译成功!所以我们学到了gcc的一个新指令 -l,引入指定名称的第三方库名称

b,如果头文件和库文件在同一目录下怎么使用

我们先把之前我们导入系统中库文件删除:

rm  /usr/include/my_*

rm /lib64/libmy_stdio.a

这时我们用gcc main.c -o main会发现程序无法编译:

可以看到系统根据c中写的头文件找不到库文件,此时在与它同名文件夹下有库函数文件。

这时用gcc main.c -o mian -lmy_stdio会发现也不行:

所以得出一个结论,gcc在查找静态库时不会在当前路径下查!

这个时候可以引入gcc的另一个指令:-L(告诉编译器,编译时查找库在指明的路径下找)

操作:gcc main.c -o main -L. -lmy_stdio

这时成功在同文件下使用静态库

c,如何封装Makefile和怎么发布静态库

首先完成.o文件的编译,然后形成库文件:

再将c文件依次编译成.o文件:

这样就可以自动形成库:

那么我们怎么发布?

这里引用一个小知识,再makefile中也是可以调用系统接口的:

这个时候就可以将写好的stdc压缩然后发给别让人用。那么假设我就是那个别人,那么我该怎么用别人打包好的库文件?

gcc指令中-I可以去指定路径下寻找头文件:

gcc main.c -I stdc/include -Lstdc/lib -lmy_stdio

2,如何手动制作动态库

1,如何形成动态库文件?

在前面章节中已经了解了静态库怎么创建,那么动态库和静态库的创建方式类似,我们直接在makefile中修改:(注意,动态库的后缀是.so)

gcc中加入-shared,可以告诉gcc不要形成可执行程序,帮我形成so库

这个时候make一下:

可以看到里面多了一个库函数文件,使用方法就是和之前一样把头文件和库文件分别拖进系统中的include和lib64文件夹中,就可以直接:

gcc main.c -lmy_stdio就可以直接运行这里就不做展示。

2,如何使用动态库

a,当动态库与main .c同文件

gcc main.c -o main -L. -lmy_stdio

讲一个系统指令:ldd,可以用来查可执行程序依赖哪些程序

可以看到main可执行程序依赖这个库文件,

如果把库删了:

就会显示找不到库文件。

3,发布动态库

流程和静态库一样:

但是这个时候gcc main.c -o main -I stdc/include -Lstdc/lib -lmy_stdio

会发现形成的main执行不了:

会发现他的ldd为空,这时因为在main运行的时候与gcc没有关系,gcc找到了链接文件不代表可执行文件找到了,os要加载你对程序,但是系统找不到动态库。

4,如何给系统指定路径找动态库

1,拷贝到默认路径下(前面已强调多次)

2,建立软链接:

sudo ln -s /路径/库名 /lib64/同名.so就可以建立软链接:

这时就可以运行程序。

3,Linux系统中,os可以根据环境变量查动态库

这个时候可以用:

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH: +路径也可以:

如果想永久加env可以vim .bash.src中加入export ....

4,讲路径写到.conf文件里

touch /etc/ld.so.conf.d/2024.conf

这时将库的路径写道2024.conf中:

然后需要用到指令ldconfig加载一下:

其中1方法和3方法比较常用,如果同时提供了so a文件呢?

gcc,g++会默认使用动态库,如果需要他只用静态库,可以加-static

这时去掉路径中的.so和-static:

可以跑?为什么?

如果只提供静态库,但是链接方法是静态库请见下篇分晓。

5,原理上理解动态库

我们知道,在堆区和栈区直接有一个共享区:

进程在执行库的方法,是在自己的地址空间中跳转运行

                                                                     

然后动态库他是从磁盘加载到内存中通过页表的映射到共享区给代码使用

                                                        

这个时候如果有其他程序也需要调用这个库,就直接从页表映射到内存中找库:

内容概要:本文设计了一种基于PLC的全自动洗衣机控制系统内容概要:本文设计了一种,采用三菱FX基于PLC的全自动洗衣机控制系统,采用3U-32MT型PLC作为三菱FX3U核心控制器,替代传统继-32MT电器控制方式,提升了型PLC作为系统的稳定性与自动化核心控制器,替代水平。系统具备传统继电器控制方式高/低水,实现洗衣机工作位选择、柔和过程的自动化控制/标准洗衣模式切换。系统具备高、暂停加衣、低水位选择、手动脱水及和柔和、标准两种蜂鸣提示等功能洗衣模式,支持,通过GX Works2软件编写梯形图程序,实现进洗衣过程中暂停添加水、洗涤、排水衣物,并增加了手动脱水功能和、脱水等工序蜂鸣器提示的自动循环控制功能,提升了使用的,并引入MCGS组便捷性与灵活性态软件实现人机交互界面监控。控制系统通过GX。硬件设计包括 Works2软件进行主电路、PLC接梯形图编程线与关键元,完成了启动、进水器件选型,软件、正反转洗涤部分完成I/O分配、排水、脱、逻辑流程规划水等工序的逻辑及各功能模块梯设计,并实现了大形图编程。循环与小循环的嵌; 适合人群:自动化套控制流程。此外、电气工程及相关,还利用MCGS组态软件构建专业本科学生,具备PL了人机交互C基础知识和梯界面,实现对洗衣机形图编程能力的运行状态的监控与操作。整体设计涵盖了初级工程技术人员。硬件选型、; 使用场景及目标:I/O分配、电路接线、程序逻辑设计及组①掌握PLC在态监控等多个方面家电自动化控制中的应用方法;②学习,体现了PLC在工业自动化控制中的高效全自动洗衣机控制系统的性与可靠性。;软硬件设计流程 适合人群:电气;③实践工程、自动化及相关MCGS组态软件与PLC的专业的本科生、初级通信与联调工程技术人员以及从事;④完成PLC控制系统开发毕业设计或工业的学习者;具备控制类项目开发参考一定PLC基础知识。; 阅读和梯形图建议:建议结合三菱编程能力的人员GX Works2仿真更为适宜。; 使用场景及目标:①应用于环境与MCGS组态平台进行程序高校毕业设计或调试与运行验证课程项目,帮助学生掌握PLC控制系统的设计,重点关注I/O分配逻辑、梯形图与实现方法;②为工业自动化领域互锁机制及循环控制结构的设计中类似家电控制系统的开发提供参考方案;③思路,深入理解PL通过实际案例理解C在实际工程项目PLC在电机中的应用全过程。控制、时间循环、互锁保护、手动干预等方面的应用逻辑。; 阅读建议:建议结合三菱GX Works2编程软件和MCGS组态软件同步实践,重点理解梯形图程序中各环节的时序逻辑与互锁机制,关注I/O分配与硬件接线的对应关系,并尝试在仿真环境中调试程序以加深对全自动洗衣机控制流程的理解。
评论 15
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值