Linux基础命令

ctrl + l         //快速清屏
rm 文件名 //删除文件,rm *.o表示删除所有.o后缀的文件
mkdir 目录名 //创建一个目录
touch 文件名 //创建一个文件
tree //查看文件目录树,但要sudo aot install tree
ll //查看所有文件
cp –r test/ newtest //将当前目录 test/ 下的所有文件复制到新目录 newtest 下
mv //移动文件到其它目录
pwd //显示当前文件的绝对路径
env //查看环境变量

1 GCC使用

安装gcc、g++

sudo apt install gcc g++

使用

gcc C程序文件 -o 目标文件名称;
gcc test.c -o app;
gcc -I是用来编译时去其它目录下找文件的



上图对应着一个代码文件变成可执行文件的过程:预处理、编译、汇编、链接。

  • 预处理:头文件的展开,注释的删除,宏替换等等。
  • 编译后变成汇编代码
  • 汇编后变成二进制目标文件
  • 最后再进行链接成可执行文件

2 静态库的制作与使用

库文件是计算机上的一类文件,可以简单的把库文件看成一种代码仓库,它提供给使用者一些可直接拿来用的变量、函数或类。库是不能单独运行的。

库文件有两种,静态库和动态库(共享库),两者的区别在于静态库在程序的链接阶段被复制到程序中,动态库在运行时由系统动态的加载到内存中供程序使用

静态库的制作:

静态库相当于是一种打包,对于要打包的几个源文件首先gcc -c变成.o文件,这里需要有相应的头文件在同一目录(或者编译的时候用-I去找)。静态库是搭配头文件使用的,我们在头文件中放被打包文件中的函数、变量等,这样就成了使用者使用静态库的一个接口。然后用ar工具打包成库文件libxxx.a(xxx为库文件的名字)。

使用实例:

gcc main.c -o app -I ./include/ -L ./lib/ -l suanshu
//-I ./include 是因为我们的头文件在那个目录下,用这种方式去找到
//-L ./lib/是指定库的位置在当前目录下的lib文件夹中,
//-l suanshu 是指定库的名称

3 动态库的制作与使用

制作:

使用的方式和静态库类似,但是需要我们在某些固定的路径下配置,否则在运行时无法查找到动态库:

其中elf文件是我们所无法修改的,但是我们可以添加环境变量,如:

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:path
//path处要写动态库的绝对地址,用pwd来获取

但是这种方式只是临时的,只要中端断开就不存在了,这里显示一种永久的方式,也就是用户级别的配置,进入到home目录中,用ll来查看所有文件,可以找到一个.bashrc文件,用vim打开它,在最下面一行添加环境变量即可



然后使用. .bashrc来使这个文件生效,后面的两种方式此处不再详述,需要的时候查找即可。

4 静态库和动态库的优缺点

静态库(Static Library)和动态库(Dynamic Library)都是用于代码复用和共享的库文件,但它们有不同的优缺点。下面是静态库和动态库的优缺点比较:

静态库的优点:

  • 编译时链接:静态库在编译时被链接到应用程序中,使得生成的可执行文件包含了库的所有代码,独立运行,不依赖于外部的运行时环境。
  • 部署简单:将静态库链接到应用程序后,可以将生成的可执行文件直接拷贝到其他机器上运行,不需要额外的依赖。
  • 性能优势:由于代码已经嵌入到应用程序中,不需要动态加载,运行时加载速度更快。

静态库的缺点:

  • 冗余:每个应用程序都包含了库的代码,可能导致可执行文件的大小较大。
  • 更新麻烦:如果库有更新,需要重新编译和链接应用程序,重新部署。

动态库的优点:

  • 共享代码:动态库被多个应用程序共享,减少了代码冗余,节省了磁盘空间。
  • 更新便捷:更新动态库时,不需要重新编译和链接应用程序,只需要替换动态库文件即可,方便维护和升级。

动态库的缺点:

  • 运行时链接:动态库在运行时被加载和链接,需要在系统中存在相应的库文件,否则会导致运行错误。
  • 部署复杂:运行动态库的应用程序需要确保库文件的正确部署和正确的版本兼容性。
  • 性能损失:由于需要动态加载,运行时加载速度较慢,可能导致稍微降低一些性能。

选择使用静态库还是动态库应该根据实际情况来决定。如果希望应用程序更加独立、部署简单且性能要求较高,可以选择静态库。如果希望共享代码、便于更新和维护,或者有多个应用程序共同使用某些功能,可以选择动态库。有时也可以结合使用,例如在开发过程中使用静态库,发布产品时使用动态库来减少可执行文件的大小。

5 makefile

Makefile 定义了源代码文件和其依赖关系,以及构建和编译这些文件的规则,使得开发者可以通过简单的命令比如make来编译整个项目,很多时候我们在修改代码后也仅需要一个make指令即可重新编译。

一个最简单的makefile:

app:test.c
gcc test.c -o app//注意命令的前面要有一个tab的距离

一些makefile的书写方式:



自动变量是指$@$^$(变量名)这样的获取变量方式

以变量的方式书写makefile如下:

#定义变量
src=sub.o add.o mult.o main.o
target=app
$(target):$(src)
$(CC) $(src) -o $(target)

另外,对于多个相似的规则书写,可以用通配符来表示



 

有些时候,我们手动书写多个依赖是不明智的,当有几十个文件作为依赖时,我们就需要使用函数来获取,makefile中是有许多函数的,这里介绍其中一个:

6 GDB

一款很有用的程序调试工具,可实现以下功能:

  • 断点调试:可以在代码中设置断点,使程序在特定位置停止执行,方便逐步跟踪代码执行过程。
  • 变量和内存查看:可以查看程序中的变量的值、内存地址和内容,帮助定位代码中的问题。
  • 栈回溯:可以查看函数调用栈的状态,了解函数的调用关系和局部变量的值。
  • 表达式求值:可以在调试过程中对表达式进行求值,并查看表达式的结果。
  • 多线程调试:支持对多线程程序的调试,可以控制各个线程的执行。
  • 远程调试:可以通过 GDB Server 进行远程调试,对于嵌入式系统等场景非常有用。



gcc -g是为了在可执行文件中加入调试信息,有了这个调试信息才方便后面的调试





第一章 Linux系统编程的更多相关文章

  1. 第一章 Linux系统入门

    设定目标,寻求方法,勤奋努力,坚持不懈. ------你们知道了,而我们做到了.------ 世界上第一台计算机:ENIAC(埃尼亚克).1946-2 宾夕法尼亚大学. 约翰·冯·诺依曼体系 电脑的组 ...

  2. Linux学习笔记 一 第一章 Linux 系统简介

    Linux简介 一.UNIX与Linux发展史

  3. Linux/Unix系统编程手册 第三章:系统编程概念

    本章介绍系统编程的基础概念和一些后续章节用到的函数及头文件,并说明了可移植性问题. 系统调用是受控的内核入口,通过系统调用,进程可以请求内核以自己的名义去执行某些动作,比如创建子进程,执行I/O操作, ...

  4. [Real World Haskell翻译]第20章 Haskell系统编程

    第20章 Haskell系统编程 到目前为止,我们已经讨论了大多数的高层次的概念.Haskell也可以用于较低级别的系统编程.很可能是用haskell编写出底层的与操作系统接口的程序. 在本章中,我们 ...

  5. 16第一章 ASP.Net编程基础知识

    第一章        ASP.Net编程基础知识 第一章        ASP.Net编程基础知识 本章首先介绍用ASP.Net技术编制服务器端动态网页所需的网络和HTML标记语言方面的有关知识.然后 ...

  6. Linux系统编程【2】——编写who命令

    学到的知识点 通过实现who命令,学到了: 1.使用man命令寻找相关信息 2.基于文件编程 3.体会到c库函数与系统调用的不同 4.加深对缓冲技术的理解 who命令的作用 who命令的使用 在控制终 ...

  7. 第一章 Andorid系统移植与驱动开发概述 - 读书笔记

    Android驱动月考1 第一章 Andorid系统移植与驱动开发概述 - 读书笔记 1.Android系统的架构: (1)Linux内核,Android是基于Linux内核的操作系统,并且开源,所以 ...

  8. Linux系统编程@进程通信(一)

    进程间通信概述 需要进程通信的原因: 数据传输 资源共享 通知事件 进程控制 Linux进程间通信(IPC)发展由来 Unix进程间通信 基于System V进程间通信(System V:UNIX系统 ...

  9. Linux 系统编程

    简介和主要概念 Linux 系统编程最突出的特点是要求系统程序员对它们工作的的系统的硬件和操作系统有深入和全面的了解,当然它们还有库和系统调用上的区别. 系统编程分为:驱动编程.用户空间编程和网络编程 ...

  10. ROS机器人程序设计(原书第2版)补充资料 (壹) 第一章 ROS系统入门

    ROS机器人程序设计(原书第2版)补充资料 (壹) 第一章 ROS系统入门 书中,大部分出现hydro的地方,直接替换为indigo或jade或kinetic,即可在对应版本中使用. 第一章主要包括R ...

随机推荐

  1. 简单地聊一聊Spring Boot的构架

    本文由葡萄城技术团队发布.转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 前言 本文小编将详细解析Spring Boot框架,并通过代码举例说明每个层的作用 ...

  2. 如何在langchain中对大模型的输出进行格式化

    简介 我们知道在大语言模型中, 不管模型的能力有多强大,他的输入和输出基本上都是文本格式的,文本格式的输入输出虽然对人来说非常的友好,但是如果我们想要进行一些结构化处理的话还是会有一点点的不方便. 不 ...

  3. OpenTiny Vue 3.12.0 发布:文档大优化!增加水印和二维码两个新组件🎈

    你好,我是 Kagol. 非常高兴跟大家宣布,2023年11月30日,OpenTiny Vue 发布了 v3.12.0 . OpenTiny 每次大版本发布,都会给大家带来一些实用的新特性,10.24 ...

  4. 给祖传系统做了点 GC调优,暂停时间降低了 90%

    问题描述 公司某规则引擎系统,在每次发版启动会手动预热,预热完成当流量切进来之后会偶发的出现一次长达1-2秒的Young GC(流量并不大,并且LB下的每个节点都会出现该情况) 在这次长暂停之后,每一 ...

  5. 【scikit-learn基础】--『预处理』之 标准化

    数据的预处理是数据分析,或者机器学习训练前的重要步骤.通过数据预处理,可以 提高数据质量,处理数据的缺失值.异常值和重复值等问题,增加数据的准确性和可靠性 整合不同数据,数据的来源和结构可能多种多样, ...

  6. MongoDB中的分布式集群架构

    MongoDB 中的分布式集群架构 前言 Replica Set 副本集模式 副本集写和读的特性 Sharding 分片模式 分片的优势 MongoDB 分片的组件 分片键 chunk 是什么 分片的 ...

  7. 异常:Caused by: org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.qbb.srb.core.mapper.DictMapper.batchInsert

    程序报错:Caused by: org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com ...

  8. Android阅读器之文本、图片和表格测量

    文章摘要 本文将介绍如何在Android开发中实现文本.图片和表格的测量.我们将使用Android Studio和Java语言,并利用Android SDK中的相关类库. 正文 文本测量 在Andro ...

  9. C++ Qt开发:QSqlDatabase数据库组件

    Qt 是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍QSqlDat ...

  10. 【Python】【OpenCV】定位二维码

    相较于BarCode,QRCode有明显的特征区域,也就是左上角.右上角.左下角三个"回"字区域,得益于hierarchy中,父子关系的轮廓是连续的(下标),所以这个时候我们就可以 ...