C++linux高并发服务器项目实践 day2

这篇具有很好参考价值的文章主要介绍了C++linux高并发服务器项目实践 day2。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

静态库的制作

库的定义和特点详情请看隔壁c++阶段学习的day10查看

静态库命名规则

  • Linux: libxxx.a
    • lib:固定前缀
    • xxx:库的名字,自定义
    • .a:固定后缀
  • windows:libxxx.lib

静态库的制作

  • gcc获得.o文件
  • 将.o文件打包,使用ar工具(archive)

ar rcs libxxx.a xxx.o xxx.o
r- 将文件插入备存文件中 c-建立备存文件 s-索引

sudo apt install tree

安装tree插件,用来更方便的查看目录下文件

将隔壁做的mylib.h、mylib.c 、mydll.c、mydll.h文件通过vscode传入虚拟机后,使用下列代码生成.o文件

gcc -c mylib.c

这里我尝试了编译mydll.c文件,因为这个文件为动态库文件,故编译阶段会报错。编译完成后,可以通过ls命令查看生产了mylib.o文件

.h作为头文件不需要编译
C++linux高并发服务器项目实践 day2
若一个完整程序如上图,想要在linux中编译main.c
需要输入代码

gcc main.c

但是这时会报错,找不到头文件,也找不到库中定义的引用

所以完整运行代码应该为

gcc main.c -o app -I ./include/ -l calc -L ./lib
这里的calc为静态库的名称而非文件夹名
大写I是找头文件 小写L是找静态库

动态库的制作

命名规则

  • LInux:libxxx.so
    • lib:固定前缀
    • xxx:库的名字,自定义
    • .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 main.c -o main -I include/ -L lib/ -l calc

这样直接执行,会动态库加载失败

动态库与静态库的区别

  • 静态库:GCC进行链接时,会把静态库中代码打包到可执行文件中
  • 动态库:GCC进行链接时,动态库的代码不会被打包到可执行文件中
  • 程序启动之后,动态库会被动态加载到内存中,通过ldd命令检查动态库依赖关系

ldd main.c

解决动态库连接失败问题

如何定位共享文件呢?

当系统加载可执行代码时,能够知道其所依赖的库的名字,但是还需要知道绝对路径。此时就需要系统的动态载入器来获取该绝对路径。对于elf格式的可执行程序,是由ld-linux.so来完成,它先后搜索elf文件的DT_RPATH段–》环境变量LD_LIBRARY_PATH—》/etc/ld.so.cache文件列表–》/lib/,/usr/lib目录找到库文件后将其载入内存

env

用于查看当前环境变量,一般由键和值,中间以‘=’连接
且一个键可以有多个值,多个值之间,以‘:’连接

方法一
可以使用以下代码,来改变环境变量,以此导入动态库,主要是需要:后面的东西

export LD_LIBRARY_PATH= $LD_LIBRARY_PATH:/home/Linux/lesson06/lib

以这种方法配置的环境变量为临时配置,当关闭当前终端,打开别的终端时,依然会报错,编译失败

方法二
在home目录下,用vim打开bashrc,使用ctrl+g跳转最后一行,o来插入上面那行代码
然后ESC进入Command模式,输入下述代码,回车就可以强制保存并退出

:wq

输入以下代码,使修改生效,两段代码效果一致

. .bashrc
source .bashrc

我这里报了export:“” :not a valid identifier,应该是环境变量写错了,检查后发现,是在export的后面一长串里面加了空格,切记在linux中这种地方不能加空格

同理,用以下代码进入管理员权限下的地址添加以上修改内容,同样是在末尾加入

sudo vim /etc/profile
因为是管理员权限进入的,所以要输入密码
source /etc/profile
用这个代码使修改生效

用以下代码可以查看修改完的环境变量是否生效

ldd 加上已经编译好文件
echo $LD_LIBRARY_PATH

方法三
用以下代码进入对应文件,换行后添加需要的路径

sudo vim /etc/ld.so.conf

因为/etc/ld.so.cache是二进制文件,我们没有权限直接修改,故我们需要进入conf来间接修改它

使用下面的代码来使用该修改

sudo ldconfig

方法四
将动态库文件,放入/lib/,/usr/lib目录
但是不推荐这种方法,因为该目录下有很多库文件,容易找不到,后期不容易修改

静态库和动态库的对比

静态库的优缺点

优点:

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

缺点:

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

动态库的优缺点

优点:

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

缺点:

  • 加载速度比静态库慢
  • 发布程序时需要提供依赖的动态库

Makefile

什么是Makefile

Makefile带来的好处就是“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。make是一个命令工具,是一个解释Makefile文件中指令的命令工具,一般来说,大多数的IDE都有这个命令

Makefile文件命名和规则

  • 文件命名:makefile或者Makefile
  • Makefile规则:
    • 一个Makefile文件中可以有一个或者多个规则
目标 ...: 依赖 ...
	命令(shell 命令)
	...
	- 目标:最终要生成的文件(伪文件除外)
 	- 依赖:生成目标所需要的文件或是目标
 	- 命令:通过执行命令对依赖操作生成目标(命令前必须Tab缩进)
 - Makefile中的其他规则一般都是为了第一条规则服务的

Makefile的使用

对于若干个.c文件,想要使用Makefile来处理他们,需要用

vim Makefile

命令来新建一个Makefile文件,其中内容按照上述的规则来输入
例如:

app:sub.c add.c mult.c div.c main.c
	gcc sub.c add.c mult.c div.c main.c -o app

同时想要使用Make命令,还需要安装make插件

sudo apt install make

输入以下指令,来运行makefile

make

工作原理

  • 命令在执行之前,需要先检查规则中的依赖是否存在
    • 如果存在,执行命令
    • 如果不存在,向下检查其他的规则,检查有没有一个规则是用来生成这个依赖的,如果找到了,则执行该规则中的命令
  • 检测更新,在执行规则中的命令时,会比较目标和依赖文件的时间
    • 如果依赖的时间比目标的时间晚,需要重新生成目标
    • 如果依赖的时间比目标的时间晚,目标不需要更新,对应规则中的命令不需要被执行

正常来说只执行第一个规则,下面的规则只有用到才执行
更新哪怕源文件只是多了个换行符,make命令后,也会重新加载对应规则

变量

  • 自定义变量
    变量名 = 变量值 var = hello
  • 预定义变量
    AR:归档维护程序的名称,默认值为ar
    CC:C编译器的名称,默认为cc
    CXX:C++编译器的名字,默认值为g++
    $@:目标的完整名称
    $<:第一个依赖文件的名称
    $^:所有的依赖文件
  • 获取变量的值
    $(变量名)

ubuntu 22.04.2版本的中文输入法设置

在设置里面将系统语言调成中文后
在键盘界面,选择汉语,然后点+号,选择汉语,选择智能拼音
就能在vm中输入拼音和中文了

模式匹配

%.o:%.c

 -  %:通配符,匹配一个字符串
 - 两个%匹配的是同一个字符串

%.o:%.c
gcc -c $< -o $@

函数

$(wildcard PATTERN…)

-$(wildcard PATTERN…)

  • 功能:获取指定目录下指定类型的文件列表
  • 参数:PATTERN指的是某个或多个目录下的对应的某种类型的文件,如果有多个目录,一般使用空格间隔
  • 返回:得到的若干个文件的文件列表,文件名之间使用空格间隔

例如:

$(wildcard *.c ./sub/*.c)

返回值格式:a.c b.c c.c d.c e.c f.c

$(patsubst ,, )

$(patsubst ,, )

  • 功能:查找 中的单词(单词以“空格”、“Tab”或“回车”“换行”分割)是否符合模式,如果匹配的话,则以替换
  • 可以包括通配符’%‘,表示任意长度的字串。如果中也包含’%‘,那么,中的这个’%'将是中的那个%所代表的字串。(可以用‘\’来转义,以‘%’来表示真实含义的‘%’字符)
  • 返回:函数返回被替换过后的字符串

例如:

$(patsubust %.c,%.o,x.c bar.c)

返回值格式:x.o bar.o

clean:
rm *.o

如果在make中加入一个规则,如上,可以使用以下规则,可以单独执行该规则

make clean

touch 文件名

上述代码可以生产一个文本文件

这里生产一个clean文件,再次使用make clean,会发现报“clean”已是最新,这是因为clean在写规则的时候,没有依赖,所以更新检测的规则依赖比目标更新是无法达成的,故会报“最新”

GDB调试

什么是GDB

GDB是由GNU软件系统社区提供的调试工具,同GCC配套组成了一套完整的开发环境,GDB是许多Linux和Unix系统的标准开发环境

一般来说,GDB主要帮助你完成下面四个方面的功能

  1. 启动程序,可以按照自定义的要求随心所欲的运行程序
  2. 可让被调试的程序在所指定的调置的断点处停住(断点可以是条件表达式)
  3. 当程序被停住时,可以检查此时程序中所发生的事
  4. 可以改变程序,将一个BUG产生的影响修正从而测试其他BUG

准备工作

通常,在为调试而编译时,我们会()关掉编译器的优化选项(‘-o’),并打开调试选项(‘-g’)。另外,‘-wall’在尽量不影响程序行为的情况下选项打开所有warning,也可以发现许多问题,避免一些不必要的BUG

‘-g’选项的作用是在可执行文件中加入源代码的信息,比如可执行文件中第几条机器指令对应源代码的第几行,但并不是把整个源文件嵌入到可执行文件中,所以在调试时必须保证GDB能找到源文件

在vim 一个文本文件是时候,可以用下述代码,令该文件里面的每一行前加上序号

:set num

GDB命令

  • 启动和退出
    gdb 可执行文件
    quit
  • 给程序设置参数/获取设置参数
    set args 10 20
    show args
  • GDB使用帮助
    help
  • 查看当前文件代码
    list/l (从默认位置显示)
    list/l 行号 (从指定的行显示)
    list/l 函数名 (从指定的函数显示)
  • 查看非当前文件代码
    list/l 文件名:行号
    list/l 文件名:函数名
  • 设置显示的行数
    show list/listsize
    set list/listsize 行数

断点操作的命令

  • 设置断点
    break / b 行号
    break / b 函数名
    break / b 文件名:行号
    break / b 文件名:函数
  • 查看断点
    info / i break/b
  • 删除断点
    delete / del / d 断点编号
  • 设置断点无效
    disable / dis 断点编号
  • 设置断点生效
    enable / ena 断点编号
  • 设置条件断点(一般用在循环的位置)
    break / b 10 if i == 5

调试的命令文章来源地址https://www.toymoban.com/news/detail-418809.html

  • 运行GDB程序
    start(程序停在第一行)
    run(遇到断点才停)
  • 继续运行,到下一个断点停
    continue / c
  • 向下执行一行代码 (不会进入函数体)
    next / n
  • 变量操作
    print / p 变量名(打印变量值)
    ptype 变量名(打印变量类型)
  • 向下单步调试(遇到函数进入函数体)
    step / s
    finish (跳出函数体)
  • 自动变量操作
    display num(自动打印指定变量的值)
    info / i display
    undisplay 编号
  • 其他操作
    set var 变量名 = 变量值
    until (跳出循环)

到了这里,关于C++linux高并发服务器项目实践 day2的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • linux并发服务器 —— 多进程并发(四)

    程序是包含一系列信息的文件,描述了如何在运行时创建一个进程; 进程是正在运行的程序的实例,可以用一个程序来创建多个进程; 用户内存空间包含程序代码以及代码所使用的变量,内核数据结构用于维护进程状态信息; 进程控制块(PCB):维护进程相关的信息,tas

    2024年02月11日
    浏览(51)
  • 【项目实战】基于高并发服务器的搜索引擎

    作者:爱写代码的刚子 时间:2024.4.24 前言:基于高并发服务器的搜索引擎,引用了第三方库cpp-httplib,cppjieba,项目的要点在代码注释中了 index.html index.hpp log.hpp parser.cc(用于对网页的html文件切分且存储索引关系) searcher.hpp util.hpp http_server.cc(用于启动服务器和搜索引擎)

    2024年04月28日
    浏览(46)
  • linux并发服务器 —— linux网络编程(七)

    C/S结构 - 客户机/服务器;采用两层结构,服务器负责数据的管理,客户机负责完成与用户的交互;C/S结构中,服务器 - 后台服务,客户机 - 前台功能; 优点 1. 充分发挥客户端PC处理能力,先在客户端处理再提交服务器,响应速度快; 2. 操作界面好看,满足个性化需求; 3.

    2024年02月09日
    浏览(73)
  • linux并发服务器 —— IO多路复用(八)

    半关闭只能实现数据单方向的传输;当TCP 接中A向 B 发送 FIN 请求关闭,另一端 B 回应ACK 之后 (A 端进入 FIN_WAIT_2 状态),并没有立即发送 FIN 给 A,A 方处于半连接状态 (半开关),此时 A 可以接收 B 发送的数据,但是 A 已经不能再向 B 发送数据 close不会影响到其他进程,shutdown会

    2024年02月09日
    浏览(49)
  • 【实战项目】c++实现基于reactor的高并发服务器

    基于Reactor的高并发服务器,分为反应堆模型,多线程,I/O模型,服务器,Http请求和响应五部分 ​全局 Channel 描述了文件描述符以及读写事件,以及对应的读写销毁回调函数,对应存储arg读写回调对应的参数 ​Channel 异或 |:相同为0,异为1 按位与:只有11为1,其它组合全部

    2024年02月12日
    浏览(51)
  • 【项目设计】仿 muduo 库实现 OneThreadOneEventLoop 式并发服务器

    本项目主要是模仿 muduo 库实现一个以主从 Reactor 为模型,以 OneThreadOneEventLoop 为事件驱动的高并发服务器组件。通过这个服务器组件,我们可以简洁快速的搭建出一个高性能的 TCP 服务器。并且组件内部会提供不同的应用层协议支持,组件使用者可以通过这些协议快速的完成

    2024年04月23日
    浏览(66)
  • Linux学习之网络编程3(高并发服务器)

    Linux网络编程我是看视频学的,Linux网络编程,看完这个视频大概网络编程的基础差不多就掌握了。这个系列是我看这个Linux网络编程视频写的笔记总结。 问题: 根据上一个笔记,我们可以写出一个简单的服务端和客户端通信,但是我们发现一个问题——服务器只能连接一个

    2024年02月01日
    浏览(47)
  • Linux网络编程:多进程 多线程_并发服务器

    文章目录: 一:wrap常用函数封装 wrap.h  wrap.c server.c封装实现 client.c封装实现 二:多进程process并发服务器 server.c服务器 实现思路 代码逻辑  client.c客户端 三:多线程thread并发服务器 server.c服务器 实现思路 代码逻辑  client.c客户端 ​​​​   read 函数的返回值 wrap.h  wrap

    2024年02月12日
    浏览(54)
  • linux并发服务器 —— 动态库和静态库实战(一)

    -E 预处理指定源文件 -S 编译指定源文件 -c 汇编指定源文件 -o 生成可执行文件 -I directory 指定Include包含文件的搜索目录 -g 编译的时候生成调试信息 -D 在程序编译时指定一个宏 -w 不生成任何的警告信息 -Wall 生成所有警告 -On n:0~3;表示编译器的优化选项级别 O0 - 不优化;O1 -

    2024年02月11日
    浏览(49)
  • 一、C++项目:仿muduo库实现高性能高并发服务器

    仿mudou库one thread oneloop式并发服务器实现 仿muduo库One Thread One Loop式主从Reactor模型实现高并发服务器: 通过实现的高并发服务器组件,可以简洁快速的完成一个高性能的服务器搭建。并且,通过组件内提供的不同应用层协议支持,也可以快速完成一个高性能应用服务器的搭建

    2024年02月07日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包