牛客Linux高并发服务器开发学习第三天

server/2024/12/22 14:16:19/

静态库的使用(libxxx.a)

将lession04的文件复制到lession05中

lib里面一般放库文件 src里面放源文件。

将.c文件转换成可执行程序

gcc main.c -o app

main.c当前目录下没有head.h

gcc main.c -o app -I ./include 

利用-I 和head所在的文件夹,找到head。

main.c用到了库里面的东西,但是没有找到,因此需要使用

gcc main.c -o app -I ./include -l calc -L ./lib 

在./lib文件夹中 找calc库文件 

回顾静态库制作和使用

目前文件夹中具有头文件、主函数文件、函数源文件。

先把函数源文件编译汇编成.o文件

gcc -c add.c div.c mult.c sub.c 

由于头文件在include文件夹里 需要在后面加上 -I ../include/

然后将.o文件打包制作成静态库

ar rcs libsuanshu.a add.o div.o mult.o sub.o 

ar rcs [库名] [*.o]

并且将静态库移动到库文件夹中

mv libsuanshu.a ../lib

编译main.c 为suanshu程序

gcc main.c -o suanshu -I ./include -l suanshu -L ./lib

-o [输出文件名] -I [头文件路径] -l [库名称] -L[库文件路径]

动态库(共享库)的制作(libxxx.so)

命名规则:

Linux:libxxx.so

Windows:libxxx.dll

gcc 得到.o文件,得到和位置无关的代码

gcc -c -fpic/-fPIC a.c b.c 

gcc 得到动态库

gcc -shared a.o b.o -o libcalc.so

动态库的使用

加载共享库时出现了错误,不能打开共享文件,虽然制定了库的目录,但找不到这个动态库。

动态库实现原理

静态库进行GCC链接时,会把静态库中的代码打包到可执行程序中。

动态库进行GCC链接时,动态库的代码不会打包到可执行程序中。

程序启动之后,动态库会被动态加载到内存中,通过ldd(list dynamic dependencies)命令检查动态库依赖关系。

1.通过配置动态库环境变量解决main找不到动态库

临时环境变量

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/ljy/Linux/lession06/library/lib

lld可以找到动态库的依赖关系,可以运行main。

重新打开终端,环境变量就失效了,这个配置是临时的。

用户级别上配置

可以在用户级别上配置,编辑~/.bashrc,在文件最后加上

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/ljy/Linux/lession06/library/lib

重启终端后,main文件仍可以找到动态库。

在.bashrc中删除最后一句,source ~/.bashrc,回到main的位置,可以发现main又找不到动态库了

系统级别上配置,需要root权限

编辑/etc/profile,在文件最后加上

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/ljy/Linux/lession06/library/lib

2.通过ld.so.cache文件列表

利用sudo编辑ld.so.conf文件,在里面加上动态库的路径,再用sudo ldconfig更新。

3.将动态库文件放入/lib/ /usr/lib目录中

什么时候使用动态库静态库。

文件比较小使用静态库,文件比较大使用动态库。

静态库优缺点

优点:静态库被打包到应用程序中加载速度快。发布程序无需提供静态库,移植方便。

缺点:消耗系统资源,浪费内存,更新、部署、发布麻烦。

动态库优缺点

优点:可以实现进程间资源共享(共享库),更新、部署、发布简单,可以控制何时加载动态库。

缺点:加载速度比静态库慢,发布程序时需要提供以来的动态库。

学习进度

Linux系统编程入门 02:34:20


http://www.ppmy.cn/server/9712.html

相关文章

Mysql基础(二)数据类型和约束

一 数据类型 讲解主要的数据类型,不面面俱到,后续遇到具体问题再查询补充扩展: 知识点的深度和广度以工作为导向 ① int float M : 表示显示宽度,M的取值范围是(0, 255)例如: int(5),当数据宽度小于5位的时候在数字前面需要用字符填满宽度说明&…

【从浅学到熟知Linux】进程间通信之匿名管道方式(进程间通信方式汇总、匿名管道的创建、匿名管道实现进程池详解)

🏠关于专栏:Linux的浅学到熟知专栏用于记录Linux系统编程、网络编程等内容。 🎯每天努力一点点,技术变化看得见 文章目录 进程间通信介绍如何实现进程间通信进程间通信分类 管道通信方式什么是管道匿名管道pipe匿名管道读写规则管…

实验2 NFS部署和配置

一、实训目的 1.了解NFS基本概念 2.实现NFS的配置和部署 二、实训准备 1.准备一台能够安装OpenStack的实验用计算机,建议使用VMware虚拟机。 2.该计算机应安装CentOS 7,建议采用CentOS 7.8版本。 3.准备两台虚拟机机(客户机和服务器机&…

Pikachu靶场通关教程

一、暴力破解 1、基于表单的暴力破解 账号:admin 密码:123456 爆破代码 #coding:utf-8 import requests import reurl http://192.168.116.136/06/vul/burteforce/bf_form.phpheaders {User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537…

「GO基础」GO程序组成要素

💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

05 JavaScript学习:语法

JavaScript 是一种动态类型的脚本语言,广泛用于网页开发和构建交互式网页。JavaScript 的语法相对简单,但功能强大,它可以在客户端执行,并与HTML和CSS一起构建交互式的网页。 JavaScript 字面量 在 JavaScript 中,字…

基于SkyEye运行Qt:著名应用程序开发框架

Qt是一个著名的跨平台的C图形用户界面应用程序开发框架,目前包括Qt Creator、Qt Designer等等快速开发工具,还支持2D/3D图形渲染、OpenGL,允许真正的组件编程,是与GTK、MFC、OWL、ATL一样的图形界面库。使用Qt开发的软件可以做到一…

为什么选择入行分布式存储

你为什么选择入行分布式存储? 一切都是机缘巧合。 转岗前参与的项目出于各种原因无法继续,在原部门已无立足之处,于是阴差阳错之下,转岗加入了分布式存储的开发团队。按照领导的安排,在原服务SE的指导下,…