首页 > 系统相关 >第一章 Linux系统编程

第一章 Linux系统编程

时间:2023-07-26 22:12:29浏览次数:43  
标签:文件 gcc 静态 编程 应用程序 第一章 编译 Linux 动态

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是为了在可执行文件中加入调试信息,有了这个调试信息才方便后面的调试
 



标签:文件,gcc,静态,编程,应用程序,第一章,编译,Linux,动态
From: https://www.cnblogs.com/dreamer-q/p/17581073.html

相关文章

  • kernel源码(二十三)Bochs运行linux0.11
    1下载Bochshttps://sourceforge.net/projects/bochs/我下载的版本为Bochs-win64-2.7.exe,双击即可安装2运行linux0.112.1不使用配置文件http://oldlinux.org/Linux.old/images/下载如下两个镜像bootimage-0.11-20040305操作系统引导镜像,包含了操作系统启动引导程序和......
  • Linux根目录扩容--两篇
    Linux根目录扩容--两篇1.命令汇总//首先查看根目录大小#df-h///查看磁盘与挂载情况,可以看到磁盘的文件系统。#lsblk#lsblk-f//查看磁盘详细信息#fdisk-1//对/dev/vda磁盘进行分区#fdisk/dev/vda //m帮助命令 Command(mforhelp):m //n添加新的分区......
  • 【雕爷学编程】Arduino动手做(173)---SG90舵机双轴云台模块
    37款传感器与执行器的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手尝试系列实验,不管成功(程序走通)与否,都会记录下来—小小的进步或是搞......
  • linux命令
    一:关机命令不管是重启系统还是关闭系统,首先要运行sync命令,把内存中的数据写到磁盘中manshutdown  --查看帮助文档halt关闭系统shutdown-hnow关闭系统poweroff 关闭系统reboot 重启系统  shutdown-rnow重启系统 ......
  • linux centos SadTalker使用指南,超级详细
    1.主要按照官方文档操作即可1.1首先安装安装anaconda1.1.1下载anaconda官网地址:FreeDownload|Anaconda wgethttps://repo.anaconda.com/archive/Anaconda3-2023.03-1-Linux-x86_64.sh  1.1.2安装shAnaconda3-2023.03-1-Linux-x86_64.sh 直接默认安装即可......
  • linux更改java版本
    查看系统版本uname-a查看java当前版本whichjavaecho$JAVA_HOME下载新的jdkhttp://www.oracle.com/technetwork/cn/java/javase/downloads解压tar-zxvfjdk-8u181-linux-x64.tar.gz修改JAVA_HOMEvim/etc/profile更新环境source/etc/profile......
  • Linux系统多个Python版本任意切换
    比如系统安装了两个python3版本:python3.8和python3.10update-alternatives用法:update-alternatives:--install需要<链接><名称><路径><优先级>分别设置这两个版本的python3:$ls/usr/bin/python3python3python3.10-configpython3-configpython3-pasteurize ......
  • Linux下实现程序开机自启(rc.local 和 systemctl)
    需求:实现了一个程序,需要在ubuntu上跑起来。能开机自启,且崩溃了也能自己重启。有两种实现方式,个人推荐第二种。方式1:实现方式:直接将要启动程序的运行命令加在/etc/rc.local中,开机时会运行这里的命令。我使用时:写了一个脚本DDR_Guard.sh,在脚本里面循环判断程序有没有开启。如......
  • linux netfilter 引发网络不稳定
     记录前因:K8S部署的集群,最近遇到域名解析失败情况,查看coredns日志,没有明显问题。解析报错:connectiontimedout;noserverscouldbereached 重启集群服务,解析没有问题,基本确认跟某个业务服务有关联解决过程: 查看跟踪连接数:sysctlnet.netfilter.nf_conntrack_coun......
  • linux自用命令
    1.touchnewfile若newfile不存在,则新建一个文件;如果存在,则修改文件的时间为当前时间 2.通配符*和?*:代表0个/1个/多个字符?:仅代表1个字符 3.find.-namenew.txt在当前目录中查找名字为new.txt的文件,可以结合前面的通配符用,用通配符的时候需要用双引号"*test"。-name是......