Alpha 第一期记录

一. 关于编译器

安装了Ubuntu后默认是自带gcc编译器的,通过gcc -v命令我们可以查看一下gcc的版本,需要关注的是红色框框部分,说明Ubuntu自带的gcc编译器是专门针对编译X86架构的芯片的程序,也就是一般的电脑上的C语言代码
在这里插入图片描述
开发板是ARM架构的芯片,我们如果要编译在ARM芯片上的程序,用到的是针对ARM芯片的交叉编译器,这里的交叉表示在X86架构的电脑上编译ARM芯片上运行的代码

二. GCC编译过程

2.1 C程序编译步骤

在这里插入图片描述
结构图如下:
在这里插入图片描述

2.2 分步编译

在这里插入图片描述
在这里插入图片描述

  • hello.c文件执行预处理操作gcc -E hello.c -o hello.i,预处理后的.i文件与.c文件的对比效果如下,只把头文件展开:
    在这里插入图片描述

  • hello.i预处理文件执行编译操作gcc -S hello.i -o hello.s转换成汇编文件,具体效果如下:
    在这里插入图片描述

  • hello.s汇编文件执行汇编操作gcc -c hello.s -o hello.o生成目标文件,但是此时目标文件是不能被执行的,根据2.1的流程图,目标文件需要加入动态库代码、启动代码等经过链接才能生成可执行文件。文件对比效果如下,这里面的乱码就是二进制的数字:
    在这里插入图片描述

  • 将hello.o文件进行链接操作变成可执行文件
    gcc hello.o -o hello

2.3 一步编译

我么平时的写法如下,直接一步编译,但是内部还是进行了预处理、编译、汇编、链接的过程:
gcc hello.c -o demo

2.4 动态库

  • 动态库就是dll文件,比如gcc里运行一个函数的时候是需要调用动态库来支持C语言的这个环境来运行你写的程序的,相当于支持这个编译器运行的一些文件
  • 环境变量告诉加载器动态库的搜索路径
    对于环境变量的解释

三. 虚拟机连接USB设备

< 1 > 快速切换USB设备的挂载

要实现USB设备快速的在连接到虚拟机与连接到Windows主机切换,可以直接操作虚拟机右下角这个位置:
在这里插入图片描述
这样如果需要切换USB设备连接Windows主机还是虚拟机就不用每次都插拔进行重新选择了。

< 2 > U盘挂载不上的问题

修改虚拟机USB设备设置为USB3.0

在这里插入图片描述

四. Linux系统各个目录的作用

/ 这就是根目录。对你的电脑来说,有且只有一个根目录。所有的东西,我是说所有的东西都是从这里开始。举个例子:当你在终端里输入“/home”,你其实是在告诉电脑,先从/(根目录)开始,再进入到home目录。
/root 这是系统管理员(root user)的目录。对于系统来说,系统管理员就好比是上帝,它能对系统做任何事情,甚至包括删除你的文件。因此,请小心使用root帐号。
/bin 这里存放了标准的(或者说是缺省的)linux的工具,比如像“ls”、“vi”还有“more”等等。通常来说,这个目录已经包含在你的“path”系统变量里面了。什么意思呢?就是:当你在终端里输入ls,系统就会去/bin目录下面查找是不是有ls这个程序。
/etc 这里主要存放了系统配置方面的文件。举个例子:你安装了samba这个套件,当你想要修改samba配置文件的时候,你会发现它们(配置文件)就在/etc/samba目录下。
/dev 这里主要存放与设备(包括外设)有关的文件(unix和linux系统均把设备当成文件)。想连线打印机吗?系统就是从这个目录开始工作的。另外还有一些包括磁盘驱动、USB驱动等都放在这个目录。
/home 这里主要存放你的个人数据。具体每个用户的设置文件,用户的桌面文件夹,还有用户的数据都放在这里。每个用户都有自己的用户目录,位置为:/home/用户名。当然,root用户除外。
/tmp 这是临时目录。对于某些程序来说,有些文件被用了一次两次之后,就不会再被用到,像这样的文件就放在这里。有些linux系统会定期自动对这个目录进行清理,因此,千万不要把重要的数据放在这里。
/usr 在这个目录下,你可以找到那些不适合放在/bin或/etc目录下的额外的工具。比如像游戏阿,一些打印工具拉等等。/usr目录包含了许多子目录:/usr/bin目录用于存放程序;/usr/share用于存放一些共享的数据,比如音乐文件或者图标等等;/usr/lib目录用于存放那些不能直接运行的,但却是许多程序运行所必需的一些函数库文件。你的软件包管理器(应该是“新立得”吧)会自动帮你管理好/usr目录的。
/opt 这里主要存放那些可选的程序。你想尝试最新的firefox测试版吗?那就装到/opt目录下吧,这样,当你尝试完,想删掉firefox的时候,你就可以直接删除它,而不影响系统其他任何设置。安装到/opt目录下的程序,它所有的数据、库文件等等都是放在同个目录下面。举个例子:刚才装的测试版firefox,就可以装到/opt/firefox_beta目录下,/opt/firefox_beta目录下面就包含了运行firefox所需要的所有文件、库、数据等等。要删除firefox的时候,你只需删除/opt/firefox_beta目录即可,非常简单。
/usr/local 这里主要存放那些手动安装的软件,即不是通过“新立得”或apt-get安装的软件。它和/usr目录具有相类似的目录结构。让软件包管理器来管理/usr目录,而把自定义的脚本(scripts)放到/usr/local目录下面,我想这应该是个不错的主意。
/media 有些linux的发行版使用这个目录来挂载那些usb接口的移动硬盘(包括U盘)、CD/DVD驱动器等等。

五. 磁盘管理的相关命令

5.1 磁盘和目录的容量查询命令

  • df:列出文件系统的整体磁盘使用量,主要查看单个文件系统的使用量
    在这里插入图片描述
  • du -h --max-depth=1:显示某个文件夹下单层的文件的容量使用情况,不会显示出子目录里每个文件的大小
    在这里插入图片描述

5.2 磁盘的挂载、卸载、分区与格式化

< 1 > 磁盘的卸载

比如U盘,先从启动器解锁,此时U盘还是挂载状态,未被弹出:
在这里插入图片描述
查看一下,都能使用,说明U盘还挂载着:
在这里插入图片描述
然后执行:sudo umount /media/zzk/PKBACK#\ 001 或者加入-f选项强制卸载,此时查看zzk目录下,U盘名字找不到了,被卸载掉了。
在这里插入图片描述

< 2 > 磁盘的挂载

1、首先在/media/zzk目录下创建一个挂载点文件夹udisk,然后查询一下设备文件:
在这里插入图片描述
在这里插入图片描述
2、将U盘的第一个分区挂载到udisk目录下:
在这里插入图片描述
3、此时查看挂载情况,发现中文显示不正常,这是因为挂载时编码不正确:
在这里插入图片描述
4、这个时候将刚才挂载的内容卸载掉,准备重新按照上述操作挂载一遍,重新挂载时加入UTF-8编码:
在这里插入图片描述
此时挂载正常且显示中文:
在这里插入图片描述

< 3 > 磁盘的分区

首先查看一下磁盘分区,sudo fdisk -l,列出所有的分区
在这里插入图片描述
如果要对U盘分区,先要按照< 1 >里的操作卸载掉U盘磁盘,然后下面开始对U盘这个分区进行创建、删除和格式化:

( 3.1 ) 删除分区

1、输入以下命令,查看U盘这个磁盘,按m进入提示环节在这里插入图片描述
2、可以先按p打印一下分区列表:
在这里插入图片描述
3、先按d删除掉分区,然后按p查看分区,发现第一个分区已经被删除
在这里插入图片描述
4、按w保存操作,再查看磁盘目录,发现只剩下sdb了,sdb1第一个分区已经被删除了
在这里插入图片描述

( 3.2 ) 创建分区

1、输入以下命令:
在这里插入图片描述
2、创建第一个分区,先按n进入创建分区操作,然后按p,分区号选1,第一个扇区默认从2048开始,如果要创建的分区大小为1GB,则输入最后一个扇区的位置2099200,也可以直接输入1GB,这里的2099200是经过计算出来的,这样1GB的分区1就创建出来了。
在这里插入图片描述
2099200的计算公式如下:
分区1大小为 1GB = 102410241024 = 1073741824字节,一个扇区是512字节,所以除以512,所以分区1大小为 1GB等于2097152个扇区,然后因为是从第2048个扇区开始的,所以还要加上2048才是最后一个扇区的位置,等于2099200

3、然后再创建第二个分区:
这里注意第一个分区结束到第二个分区的起始扇区之间又空了2048个扇区,咱现在也不知道为什么
在这里插入图片描述
在这里插入图片描述
4、再把U盘剩余的大小当做第三个分区,此时按照默认操作即可:
在这里插入图片描述
5、按w保存,然后查看一下我们创建的三个分区:
在这里插入图片描述
6、也可以使用如下命令,查看一下U盘的具体磁盘使用,也能看到分区情况:
在这里插入图片描述

( 3.3 ) 创建完分区需要格式化
  • 格式化:就是给每一个分区装一个文件系统,比如FAT

1、下面给三个分区全部装FAT文件系统,执行如下命令:
在这里插入图片描述
2、此时U盘就产生了三个分盘:
在这里插入图片描述
3、在Windows下也能看见U盘被分区成了三个:
在这里插入图片描述

六. Make工具和Makefile

< 1 > make工具介绍

利用make工具可以自动完成编译工作,这些工作包括:

  • 如果修改了某几个源文件,则只重新编译这几个源文件,其它的文件不会再重新编译了
  • 如果某个头文件被修改了,则重新编译所有包含该头文件的源文件,其它文件不会重复编译了

利用这种自动编译可以避免不必要的重复编译。make工具通过Makefile文件来完成并自动维护编译工作,Makefile文件描述了整个工程的编译、连接规则

< 2 > 为什么要用make工具

  • gcc在编译的时候会把所有的文件都重新编译一遍,没有修改的文件也会被重新编译,如果只有很少的.c文件这是可以接受的,但是在后面编译Linux源码文件的时候,它一般是包含几万个文件的,这样全部编译一遍需要耗费很长的时间,而我们平时修改代码时只修改了一个.c文件的一小部分内容,如果每次只修改一点内容就将所有文件全部重新编译一遍,这样效率极低,速度还很慢。所以引入make工具,make工具可以使我们修改了哪部分的文件就只编译修改的那一部分的文件。
  • 在gcc编译器里避免重复编译的方法是:先将每个单独的.c文件加入-c选项编译成.o的目标文件,最后把gcc所有的目标文件将目标文件链接起来,此时若只改变了其中一个.c文件的内容,只需要gcc -c 这一个文件重新编译生成目标文件,然后再与其他的目标文件一起链接就可以避免重复编译,这种方法虽然可行,但是操作很繁琐,还是需要引入make工具
发布了22 篇原创文章 · 获赞 5 · 访问量 464

猜你喜欢

转载自blog.csdn.net/RedValkyrie/article/details/105318697