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

静态库的使用(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

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

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

相关文章

进程控制相关

进程终止 进程终止时,操作系统要释放对应进程申请的相关内核数据结构和对应的代码和数据。其不本质就是释放进程申请的系统资源。 进程终止的常见方式: 1、代码运行完毕且结果正确。 2、代码运行完毕但结果不正确。 3、代码没运行完,进程…

【Entity Framework】闲话EF中批量配置

【Entity Framework】闲话EF中批量配置 文章目录 【Entity Framework】闲话EF中批量配置一、概述二、OnModelCreating中的批量配置元数据API的缺点 三、预先约定配置忽略类型默认类型映射预先约定配置的限制约定添加新约定替换现有约定约定实现注意事项 四、何时使用每种方法进…

通过实例学C#之ArrayList

介绍 ArrayList对象可以容纳若干个具有相同类型的对象,那有人说,这和数组有什么区别呢。其区别大概可以分为以下几点: 1.数组效率较高,但其容量固定,而且没办法动态改变。 2.ArrayList容量可以动态增长,但…

使用go和消息队列优化投票功能

文章目录 1、优化方案与主要实现代码1.1、原系统的技术架构1.2、新系统的技术架构1.3、查看和投票接口实现1.4、数据入库MySQL协程实现1.5、路由配置1.6、启动程序入口实现 2、压测结果2.1、设置Jmeter线程组2.2、Jmeter聚合报告结果,支持11240/秒吞吐量2.3、Jmeter…

vue 一键更换主题颜色

这里提供简单的实现步骤,具体看自己怎么加到项目中 我展示的是vue2 vue3同理 在 App.vue 添加 入口处直接修改 #app { // 定义的全局修改颜色变量--themeColor:#008cff; } // 组件某些背景颜色需要跟着一起改变,其他也是同理 /deep/ .ant-btn-primar…

『FPGA通信接口』汇总目录

Welcome 大家好,欢迎来到瑾芳玉洁的博客! 😑励志开源分享诗和代码,三餐却无汤,顿顿都被噎。 😭有幸结识那个值得被认真、被珍惜、被捧在手掌心的女孩,不出意外被敷衍、被唾弃、被埋在了垃圾堆。…

【Linux学习】Linux编辑器-vim使用

这里写目录标题 1. 🌠vim的基本概念🌠2. vim的基本操作🌠3.vim异常处理🌠4. vim正常模式的相关命令🌠5. vim末(底)行模式相关命令 vi/vim都是多模式编辑器,不同的是vim是vi的升级版本…

开发与产品的战争之自动播放视频

开发与产品的战争之自动播放视频 起因 产品提了个需求,对于网站上的宣传视频,进入页面就自动播放。但是基于我对chromium内核的一些浅薄了解,我当时就给拒绝了: “浏览器不允许”。(后续我们浏览器默认都是chromium内核的&#…

2024年华中杯数模竞赛A题完整解析(附代码)

2024年华中杯数模竞赛A题 基于动态优化的太阳能路灯光伏板朝向以最大化能量收集研究摘要问题重述问题分析模型假设符号说明 代码问题一 完整资料获取 基于动态优化的太阳能路灯光伏板朝向以最大化能量收集研究 摘要 随着可再生能源技术的发展,太阳能作为一种清洁的…

C++类与对象(中)②

目录 1.赋值运算符重载 1.1运算符重载 1.2赋值运算符重载 1.2.1赋值运算符重载格式 1.2.2赋值运算符只能重载成成员函数不能重载成全局函数 1.2.3同拷贝函数一样,如果类是形如日期类这样变量全是内置类型的,赋值运算符就必须自己实现,…

Spectre-v1 简介以及对应解决措施

文章目录 前言一、Variant 1: Exploiting Conditional Branches.二、 BACKGROUND2.1 Out-of-order Execution2.2 Speculative Execution2.3 Branch Prediction2.4 The Memory Hierarchy2.5 Microarchitectural Side-Channel Attacks2.6 Return-Oriented Programming 三、 ATTAC…

大学生简历大赛演讲稿(6篇)

大学生简历大赛演讲稿(6篇) 以下是六篇大学生简历大赛演讲稿的范文,供您参考: 范文一:展现真我,点亮未来 尊敬的评委、亲爱的同学们: 大家好! 今天,我站在这里&#xf…

区块链实验室(35) - 编译solana for ARM64版

今天终于成功编译solana for arm64版,编译时间巨长。见下图所示。编译步骤详见solana网站https://github.com/solana-labs/solana和https://docs.solanalabs.com/。

【C语言】【数据结构】项目实践——贪吃蛇游戏(超详细)

前言 本篇博客我们来实现一个小游戏项目——贪吃蛇,相信肯定很多人都玩过,那么整个贪吃蛇是怎么实现出来的那,这个项目用到了很多方面的知识:C语言函数、枚举、结构体、动态内存管理、预处理指令、链表、Win32 API等。我们就通过这…

nodejs工具模块学习

util 是一个Node.js 核心模块,提供常用函数的集合; util.inspect(object,[showHidden],[depth],[colors]) 是一个将任意对象转换 为字符串的方法,通常用于调试和错误输出; 如果只有一个参数 object,是要转换的对象&…

网工内推 | 兴业银行总行正编,科技运维部,硕士以上学历

01 兴业银行 招聘岗位:安全渗透专家 职责描述: 1.负责牵头组织本行红蓝对抗、攻防演练等工作; 2.负责牵头制定有效的渗透测试方案,开展对本行防御体系的验证工作; 3.负责牵头组织本行各类应用系统的渗透测试与漏洞扫…

java的Spring XML和注解解析深入理解

正文 熟悉IOC体系结构 要学习Spring源码,我们首先得要找准入口,那这个入口怎么找呢?我们不妨先思考一下,在Spring项目启动时,Spring做了哪些事情。这里我以最原始的xml配置方式来分析,那么在项目启动时&a…

大型网站系统架构演化实例_5.使用反向代理和CDN加速网站响应

1.使用反向代理和CDN加速网站响应 随着网站业务不断发展,用户规模越来越大,由于区域的差别使得网络环境异常复杂,不同地区的用户访问网站时,速度差别也极大。有研究表明,网站访问延迟和用户流失率正相关,网…

二叉检索树(定义、意义、存储数据元素形式),二叉检索树插入方法的图解和实现

1、二叉检索树: (1)定义 二叉检索树的任意一个结点,设其值为k,则该节点左子树中任意一个结点的值都小于k;该节点右子树中任意一个节点的值都大于或等于k 这里的比较规则可以是针对数字的,也可…

js实现抽奖效果

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>随机抽奖</title> </head> <body>…