第2章 Linux操作系统应用入门

前面说过嵌入式系统就是一个专用的计算机系统,既然如此我们就要学会如何使用Linux操作系统。

2.1启动Linux系统

1.在宿主机上启动虚拟机,点击启动Ubuntu系统。 如下图所示:

2、Ubuntu系统启动以后,出现登录画面,选择用户名,并输入用户密码,登录系统,如下图所示。

 

3. 进入虚拟机后,打开菜单Applications->Accessories->Terminal,打开终端。

 

4.进入终端后,你就可以在终端中输入相关的Linux命令了,如下图所示。

我们既可以在图形界面,也可以在字符界面下启动和操作Linux系统,Linux中的操作大部分都可以以图形界面界面的形式操作,普通的用户并不会用太大的不适感。

对于初学者来说,比较习惯与使用图像界面,但是作为科技人员来说,要习惯使用字符界面,图形界面要耗费大量的资源,因而有的时候,系统可能根本不会提供图形化界面,在某些嵌入式系统中甚至只有字符界面。要想充分利用Linux系统的优势,对Linux系统进行更精细化操作或进行的Linux系统下的开发的话,还是必须掌握字符界面有关操作技巧的。

小贴士:

   在Ubuntu中直接按ctrl+Alt+T组合键可以直接打开终端。

2.2 Linux文件

Linux一个非常重要的思想是“一切皆文件”。文件是Linux系统中非常重要的概念。

需要注意的是Linux系统中文件名是区分大小写的,如readme和ReadMe是两个不同的文件,并且在Linux系统中文件名也不存在所谓扩展名,Linux系统也不会根据所谓扩展名来区分文件,这是与Windows系统不同的。同时也需要注意的是当一个文件名以小圆点.开头表示这个文件是隐藏文件。

2.2.1Linux目录

与Windows系统下一样,在Linux中也是通过目录来组织文件的。但不同的是,在 Linux 或 Unix 操作系统中,所有的文件和目录都被组织成以一个根节点开始的倒置的树状结构,而不象Windows那样找不到所谓的C盘、D盘。Linux中文件系统的最顶层是由根目录开始的,系统使用 / 来表示根目录。在根目录之下的既可以是目录,也可以是文件,而每一个目录中又可以包含子目录文件。如此反复就可以构成一个庞大的文件系统。

登录系统后,在当前终端窗口下输入命令:

ls /

你会看到如下图所示:

bin      dev    home    lost+found    mnt     proc    sbin     srv      tmp    var 

boot    etc     lib           media            opt      root     sys      usr 

详细的目录介绍如下表所示:

目录 作用 备注
/boot 存放的启动Linux 时使用的内核文件,包括连接文件以及镜像文件。 系统启动必须
/etc 这个目录用来存放所有的系统管理所需要的配置文件和子目录。
/lib 这个目录里存放着系统最基本的动态连接共享库,其作用类似于Windows里的DLL文件。几乎所有的应用程序都需要用到这些共享库。
/ sys 这是linux2.6内核的一个很大的变化。该目录下安装了2.6内核中新出现的一个文件系统 sysfs,该文件系统直观反映内核设备树。当一个内核对象被创建的时候,对应的文件和目录也在内核对象子系统中被创建。
/bin bin是Binary的缩写, 这个目录存放着最经常使用的命令。 指令集合
/sbin s就是Super User的意思,这里存放的是系统管理员使用的系统管理程序。
/home 用户的主目录,在Linux中,每个用户都有一个自己的主目录,一般该目录名是以用户的账号命名的。 账户
/root 该目录为系统管理员,也称作超级权限者的用户主目录。
/dev dev是Device(设备)的缩写, 该目录下存放的是Linux的外部设备,在Linux中访问设备的方式和访问文件的方式是相同的。 外部文件管理
/media linux系统会自动识别一些设备,例如U盘、光驱等等,当识别后,linux会把识别的设备挂载到这个目录下。
/mnt 系统提供该目录是为了让用户临时挂载别的文件系统的,我们可以将光驱挂载在/mnt/上,然后进入该目录就可以查看光驱里的内容了。
/lost+found 这个目录一般情况下是空的,当系统非法关机后,这里就存放了一些文件。 临时文件
/ tmp 这个目录是用来存放一些临时文件的。
/opt 默认是空的,用户安装的额外软件一般放在这里。 扩展用的
/srv 存放服务启动后需要提取的数据(不用服务器就是空)
/ var  存放经常修改的数据,比如程序运行的日志文件(/var/log 目录下)。 运行过程中要用
/proc 这个目录是一个虚拟的目录,它是系统内存的映射,我们可以通过直接访问这个目录来获取系统信息。
/usr 用户的很多应用程序和文件都放在这个目录下,类似于windows下的program files目录。 用户目录,这是一个非常重要的目录

在Linux文件系统中还有几个特殊的目录,一个用户所在的工作目录,也叫当前目录,可以使用一个点 . 来表示;另一个是当前目录的上一级目录,也叫父目录,可以使用两个点 .. 来表示;用户的主目录,可以用一个点波浪线~表示:

  •  . :代表当前的工作目录,也可以使用 ./ 来表示;
  •  .. :代表当前的工作目录的父目录,也可以 ../ 来代表。
  • ~ :代表用户的主目录,一般位于/home下,以用户名命名。

小贴士:

图形界面下,打开菜单places->Home Folder 将打开一个文件浏览器,如下图所示。对于初学者来说,图形化界面非常容易操作。点击文件图标可以打开文件,右击还可以有更多的操作,与Windows系统基本类似,此处不再详述,读者可自行探索。

2.2.2文件类型

Linux下主要的文件类型可分为4种:普通文件、目录文件、链接文件和设备文件。

  1. 普通文件:用户最常使用的文件,即我们通常意义上所说的文件。它包括文本文件、数据文件、二进制可执行文件等。
  2. 目录文件:在Linux中目录也是文件,其内容包含了文件名和子目录名以及指向文件和子目录的指针。
  3. 链接文件:类似于Windows系统中的快捷方式,但并不完全一样,可分为软链接文件和硬链接文件
  4. 设备文件:在Linux中把设备抽象成文件,然后对设备的操作就像对普通文件一样。Linux中设备相关的维护一般都在“/dev”目录下。

2.2.3文件属性

在linux终端中输入“ls -l”将列出当前目录下的所有文件及目录的相关信息,如

ada@Ubuntu:~$ ls -l
total 64
rxwxr-xr-x  1 ada ada   712  2017-11-12 23:15 build
drwxr-xr-x  2 ada ada 4096 2019-06-18 22:11 Desktop
..........

在上面的实例中每一行表示某一个文件或目录的信息,共有8组信息:文件类型及权限,文件硬链接数,文件属主名,文件属组名,文件大小,文件时间戳及文件名。

其中第一个字符代表这个文件是目录、文件或链接文件等等。

  • 当为[ d ]则是目录
  • 当为[ - ]则是文件;
  • 若是[ l ]则表示为链接文档(link file);
  • 若是[ b ]则表示为设备文件里面的块设备(可随机存取装置),如硬盘等;
  • 若是[ c ]则表示为设备文件里面的字符设备,例如键盘、鼠标(一次性读取装置)。

接下来的字符中,以三个为一组,且均为『rwx』 的三个参数的组合。其中,[ r ]代表可读(read)、[ w ]代表可写(write)、[ x ]代表可执行(execute)。 要注意的是,这三个权限的位置不会改变,如果没有权限,就会出现减号[ - ]。第1-3位确定属主(该文件的所有者)拥有该文件的权限。第4-6位确定属组(所有者的同组用户)拥有该文件的权限,第7-9位确定其他用户拥有该文件的权限。

注意:在Linux文本环境中,对于命令前的“ada@Ubuntu:~#”,其中“ada”表示登录用户名,“Ubuntu”表示计算机名,而“~”表示的是用户当前目录,最后的字符为命令提示符。Linux操作系统默认是使用普通账户登录系统的,默认的命令提示符为“$”,如果使用root超级用户账号登录系统后,默认的命令提示符为"#"。

2.3 Linux 常用命令

Linux是一款高可靠性、高性能的操作平台,其优越性在用户直接使用命令行(shell环境)运行时将得到更加充分的体现,嵌入式系统开发者需要掌握一定的Linux命令。Linux命令系统的命令很多,但是对嵌入式系统开发者来说,只要重点掌握20多条即可,其他的需要时可以查询相关资料学习。

Linux命令一般包括文件及文件夹管理命令,用户管理命令,系统管理命令,网络管理命令及其他等

2.3.1文件与目录管理

Linux的目录结构为树状结构,最顶级的目录为根目录 /。其他目录通过挂载可以将它们添加到树中,通过解除挂载可以移除它们。学习文件与目录管理目录需要先知道什么是绝对路径与相对路径。

  • 绝对路径:
    路径的表示方法,由根目录 / 开始写起,例如: /usr/share/doc 这个目录。
  • 相对路径:
    路径的表示方法,不是由 / 写起,而是某个指定位置开始写起,例如当前路径为 /usr/share/doc ,要表示 /usr/share/man ,可以写成 ../man 。
命令   说明 格式
ls list 列出指定目录下的文件信息 ls  [选项]  [文件名]
cd change Directory 切换工作目录 cd 目录名
pwd print work directory 显示目前的目录 pwd
mkdir Make Directory 创建一个新的目录 mkdir  [选项] 目录名
cp Copy file 复制文件或目录 cp  [选项]  源文件名 目标文件名
rm Remove file 删除文件或目录 rm  [选项]   文件名
mv Move file 移动文件与目录,或修改文件与目录的名称 mv   [选项]  源文件名 目标文件名
cat Concatenate 从第一行开始显示文本文件内容 cat   [选项]  文件名
chmod Change mode 修改文件访问权限 chmod  [选项]  权限字符串 文件名
tar Tape ARchive 对文件打包压缩及解包 tar  [选项]  文件名 

注:[]表示其中的内容是可选的

ls命令:显示指定目录(或当前目录)下的内容

使用者:所有使用者

使用方式:ls  [选项]  [文件名]

-a:显示所有文件及目录,包括隐藏文件或隐藏目录

-l:将文件权限、使用者、大小等信息详细列出

-r:将文件按照文件名相反此项显示(原定依英文字母次序)

-t:将文件按照文件建立世界的先后次序列出

-R:若目录下有文件,则其下的文件亦依序列出

注意:在命令使用中可以结合文件名通配符。Linux的命令可以使用文件名通配符“*”、“?”和“[]”,其中“*”代表任意个字符,“?”代表单个字符,“[]”代表所包括的字符。

例:列出当前目录下所有以‘s’开头的文件的详细信息

ls -al s*

cd:切换工作目录

使用者:所有使用者

使用方式:cd 目录名

例:切换到/mnt/hgfs/shared目录

cd  /mnt/hgfs/shared

例:切换到用户主目录

cd  ~

pwd: 显示目前的目录

使用者:所有使用者

使用方式:pwd

例:显示用户所在的目录

pwd

/home/ada

mkdir:创建一个新的目录

使用者:所有使用者

使用方式:mkdir  [选项] 目录名

-p :递归创建所需要的目录(包含上一级目录)

-m :配置目录的权限。如果没有加上 -m 来强制配置属性,系统会使用默认属性

例:创建一名为 test 1的新目录

mkdir test

例:创建一名为 test2 的新目录,其权限为rwx--x--x

mkdir  mkdir -m 711 test2 

例:创建一名为 test 3的新目录,在test3下创建1目录,在1目录下创建2目录

mkdir   -p test3/1/2

cp:复制文件或目录

使用者:所有使用者

使用方式:cp  [选项]  源文件名 目标文件名

-p:连同文件的属性一起复制过去,而非使用默认属性(备份常用);

-d:若来源档为连结档的属性(link file),则复制连结档属性而非文件本身;

-f:为强制(force)的意思,若目标文件已经存在且无法开启,则移除后再尝试一次;

-i:若目标档(destination)已经存在时,在覆盖时会先询问动作的进行(常用)

-r:递归持续复制,用於目录的复制行为;(常用)

例:将当前文件目录下的main.c 复制到/mnt/hgfs/shared中,并重新命名为hello.c

cp main.c   /mnt/hgfs/shared/hello.c

例:将/opt下的所有文件复制到/mnt/hgfs/shared中

cp  -fir /opt/*   /mnt/hgfs/shared/*

rm:删除文件或目录

使用者:所有使用者

使用方式:rm  [选项]   文件名

-f :就是 force 的意思,忽略不存在的文件,不会出现警告信息;

-i :互动模式,在删除前会询问使用者是否动作

-r :递归删除!这是非常危险的选项

例:删除test3目录及其子目录,并在删除时进行提示

rm -fir test3

mv:移动文件与目录,或修改文件与目录的名称

使用者:所有使用者

使用方式:mv   [选项]  源文件名 目标文件名

-f :force 强制的意思,如果目标文件已经存在,不会询问而直接覆盖;

-i :互动模式, 若目标文件 已经存在时,就会询问是否覆盖!

-u :若目标文件已经存在,且源文件名 比较新,才会移动

例:将main.c文件移到test目录中,并改名为hello.c

mv main.c test1/hello.c

cat:从第一行开始显示文本文件内容

使用者:所有使用者

使用方式:cat   [选项] 文件名

-n :列印出行号,包括空白行也会有行号

-b :列出行号,仅针对非空白行做行号显示,空白行不标行号

例:显示test1/ hello.c内容

cat  test1/hello.c

chmod:修改文件访问权限

使用者:所有使用者

使用方式:chmod  [选项]  权限字符串 文件名

-c : 若该文件权限确实已经更改,才显示其更改动作

-v : 显示权限变更的详细资料

权限设定字串格式如下 :

[ugoa...][[+-=][rwxX]...][,...]

其中:

u 表示该文件的拥有者,g 表示与该文件的拥有者属于同一个群体(group)者,o 表示其他以外的人,a 表示这三者皆是。

+ 表示增加权限、- 表示取消权限、= 表示唯一设定权限。

r 表示可读取,w 表示可写入,x 表示可执行,X 表示只有当该文件是个子目录或者该文件已经被设定过为可执行。

此外chmod也可以用数字来表示权限,语法为:

chmod abc file

其中a,b,c各为一个数字,分别表示User、Group、及Other的权限。r=4,w=2,x=1

若要rwx属性则4+2+1=7;

若要rw-属性则4+2=6;

若要r-x属性则4+1=5。

例:将test/hello.c设为所有人可读可写可执行

chmod 777 test1/hello.c

或chmod a+rwx  test1/hello.c

tar命令:文件和目录的打包备份或还原命令。

使用权限:所有使用者

使用方式:tar 主选项 [选项]  文件名 

说明:能够将指定的文件和目录打包成一个归档文件,或将一个打包文件还原。

-c:创建新的归档文件

-x:从归档文件中还原文件

-f:指定打包文件或还原的文件名,这个是必选的,代表文件

-v:详细报告tar处理的文件详细

-z:用gzip来压缩或解压

-j:用bzip2来压缩或解压

-J:用xz来压缩或解压

-C:配合选项x,指定解压文件要存储的位置

例:将arm-linux-gcc-4.4.3.tar.gz  文件解压在/opt下,解压过程中显示解压信息

tar xzvf arm-linux-gcc-4.4.3.tar.gz  -C  /opt

2.3.2用户管理命令

命令   说明 格式
su Swith user 转换用户 su [选项] 
ps Processes Status 显示进程状态 ps [选项]  进程号 
kill   终止进程 kill [选项]  进程号 
useradd   添加用户 useradd [选项]  用户名
userdel   删除用户 userdel [选项]  用户名

2.3.3系统相关命令

命令   说明 格式
ps Processes Status 显示进程状态 ps [选项]  进程号 
kill   终止进程 kill [选项]  进程号 
useradd   添加用户 useradd [选项]  用户名
userdel   删除用户 userdel [选项]  用户名
passwd   设置用户密码

passwd  [选项] [用户名]

sudo   以系统管理者的身份执行指令 sudo command
export   设置或显示环境变量 export [-fnp] [变量名称]=[变量设置值]
set   设置所使用shell的执行方式 set  [选项] 
su Swith user 转换用户 su [选项] 

ps:显示进程状态

使用者:所有使用者

使用方式:ps [选项]  

有的时候我们要终止一个进程的执行或者了解该进程的执行情况,我们就可以通过ps命令获得进程的进程号(pid)等信息。ps 的参数非常多,这里直接给出常用的命令:ps aux  该命令将显示系统中所有进程信息。其输出格式 为:

USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND

其中

  • USER: 进程拥有者
  • PID:  进程号
  • %CPU: 占用的 CPU 使用率
  • %MEM: 占用的存储器使用率
  • VSZ: 占用的虚拟存储器大小
  • RSS: 占用的存储器大小
  • TTY: 终端的次要装置号码 (minor device number of tty)
  • STAT: 该进程的状态:

         D: 无法中断的休眠状态 (通常 IO 的进程)

         R: 正在执行中

         S: 静止状态

         T: 暂停执行

        Z: 不存在但暂时无法消除

        W: 没有足够的记忆体分页可分配

        <: 高优先序的行程

        N: 低优先序的进程

        L: 有存储器分页分配并锁在存储器内 (实时系统或捱A I/O)

  • START: 进程开始时间
  • TIME: 执行的时间
  • COMMAND:所执行的指令

kill:终止进程

使用者:所有使用者

使用方式:kill [选项]  进程号 

kill命令用于删除执行中的程序或工作。

kill可将指定的信息送至程序。预设的信息为SIGTERM(15),可将指定程序终止。若仍无法终止该程序,可使用SIGKILL(9)信息尝试强制删除程序。程序或工作的编号可利用ps指令查看。

  • -s <信息名称或编号>  指定要送出的信息。

例:杀死进程12345

kill 12345

例:彻底杀死进程12345

kill -9 12345

useradd:添加用户

使用者:管理员

使用方式:useradd [选项]  用户名 

Linux系统是一个多用户多任务的分时操作系统,任何一个要使用系统资源的用户,都必须首先向系统管理员申请一个账号,然后以这个账号的身份进入系统,不同的用户用不同的权限,不同的用户有不同的主目录。其中root用户是系统的超级管理员,为系统的缺省用户,具有最高权限,其主目录为/root,其他用户的主目录一般位于/home下的与用户同名的目录,其权限由root赋予。

useradd命令用于建立用户帐号。帐号建好之后,再用passwd设定帐号的密码.而可用userdel删除帐号。使用useradd指令所建立的帐号,实际上是保存在/etc/passwd文本文件中。

-c comment 指定一段注释性描述。

-d 目录 指定用户主目录,如果此目录不存在,则同时使用-m选项,可以创建主目录。

-g 用户组 指定用户所属的用户组。

-G 用户组,用户组 指定用户所属的附加组。

-s Shell文件 指定用户的登录Shell。

-u 用户号 指定用户的用户号,如果同时有-o选项,则可以重复使用其他用户的标识号。

例:创建了一个用户sam,并设定用户主目录为/home/sam,并属于ada用户组。

useradd  -d  /home/ada  -m  -g ada

passwd:设置用户密码

使用者:所有使用者

使用方式:passwd  [选项] [用户名]

用户管理的一项重要内容是用户口令的管理。用户账号刚创建时没有口令,但是被系统锁定,无法使用,必须为其指定口令后才可以使用,即使是指定空口令。超级用户可以为自己和其他用户指定口令,普通用户只能用它修改自己的口令。如果默认用户名,则修改当前用户的口令。普通用户修改自己的口令时,passwd命令会先询问原口令,验证后再要求用户输入两遍新口令,如果两次输入的口令一致,则将这个口令指定给用户;而超级用户为用户指定口令时,就不需要知道原口令。

-l 锁定口令,即禁用账号。

-u 口令解锁。

-d 使账号无口令。

-f 强迫用户下次登录时修改口令。

例:给sam用户设定密码

passwd sam 

sudo:以系统管理者的身份执行指令

使用者:在 /etc/sudoers 中有出现的使用者。

使用方式:sudo command

export:设置或显示环境变量

使用方式:export [-fnp][变量名称]=[变量设置值]

说明:在shell中执行程序时,shell会提供一组环境变量。export可新增,修改或删除环境变量,供后续执行的程序使用。export的效力仅及于该次登陆操作。

-f  代表[变量名称]中为函数名称。

-n  删除指定的变量。变量实际上并未删除,只是不会输出到后续指令的执行环境中。

-p  列出所有的shell赋予程序的环境变量。

例:列出当前的所有环境变量值

# export -p 

例:显示当前的环境变量PATH的值

# export $PATH

例:将/opt/toolschain/arm-linux-gcc/bin加入当前的搜索路径中

 export PATH=PATH:/opt/toolschain/arm-linux-gcc/bin

小知识:

Linux是一个多用户的操作系统,每个用户登录系统时都会有一个专用的运行环境,通常情况下每个用户的默认的环境都是相同的。这个默认环境就是一组环境变量的定义。每个用户都可以通过修改环境变量的方式对自己的运行环境进行配置。

环境变量主要分三种:1是对所有用户有效,并且是“永久的”,其一般保存在/etc/profile文件中,由root添加。2是仅对当前用户有效,并且是“永久的”,其一般保存在用户目录下的.bash_profile或.bashrc文件。3是仅对当前shell (BASH) 有效(临时的),当前对话结束就失效的。在shell的命令行下直接使用[export变量名=变量值]定义变量,该变量只在当前的shell(BASH)或其子shell(BASH)下是有效的,shell关闭了,变量也就失效了,再打开新shell时就没有这个变量,需要使用的话还需要重新定义。

set:设置所使用shell的执行方式

使用方式:set [选项]  

-a  标示已修改的变量,以供输出至环境变量。

-b  使被中止的后台程序立刻回报执行状态。

-C  转向所产生的文件无法覆盖已存在的文件。

-d  Shell预设会用杂凑表记忆使用过的指令,以加速指令的执行。使用-d参数可取消。

-e  若指令传回值不等于0,则立即退出shell。

-f  取消使用通配符。

-h  自动记录函数的所在位置。

-H Shell  可利用"!"加<指令编号

例:显示环境变量

# set
BASH=/bin/bash
BASH_ARGC=()
BASH_ARGV=()
BASH_LINENO=()
BASH_SOURCE=()
.............................

2.3.4网络相关命令

命令 说明 格式
ifconfig 显示或设置网络设备 ifconfig [网络设备] [选项]
ping 检测主机 ping  [选项] 主机名或IP

ifconfig:显示或设置网络设备

使用方式:ifconfig [网络设备] [选项]

ping:检测主机

使用方式:ping  [选项] 主机名或IP

2.3.5其他

命令   说明 格式
clear   清屏 clear
echo   输出字符串到标准输出设备(屏幕) echo [选项] 字符串
mount   挂载文件系统 mount [选项] 设备或结点目标目录
man MANual pages 显示命令帮助 man [领域代号] 命令名
       

2.3.5输入输出重定向和管道

重定向就是使用文件代替标准输入、标准输出和标准错误输出。

重定向有5种方式,分别是: 输出重定向、输入重定向、错误重定向、追加重定向以及同时实现输出和错误的重定向。

标准输入 (stdin)      :代码为 0 ,使用 < 或 << ;

标准输出 (stdout)    :代码为 1 ,使用 > 或 >> ;

标准错误输出(stderr):代码为 2 ,使用 2> 或 2>> ;

其中,有一个箭头的表示以覆盖的方式重定向,而有两个箭头的表示以追加的方式重定向。

可以将不需要的标准输出以及标准错误输出重定向到 /dev/null ,相当于扔进垃圾箱。

如果需要将标准输出以及标准错误输出同时重定向到一个文件,需要将某个输出转换为另一个输出,例如 2>&1 表示将标准错误输出转换为标准输出。

$ find /home -name .bashrc > list 2>&1

2.3.6命令行风格

linux中有三种约定区分选项和参数:原始的Unix风格、GNU风格和X tookit风格。

Unix风格:以连字符'-'开头的单个字符(System V风格)或没有连字符'-'开头的单个字符(BSD风格)。如果选项后面不带参数,则被称为模式选项,模式选项可以组合在一起使用。如果选项带参数,这些参数要紧接在选项后面(是否以空格分隔可选)。特点是比较简洁,但是选项有可能不够用。

如: gcc -v

GNU风格:使用两个连续的连字符‘--’后接关键字(注意,不是单个字符)。GNU风格的选项不用空格就不能组合使用。选项参数既可以用空格分隔也可以使用单个等号“=”来分隔。特点是容易理解,也容易输入错误或记不住。

如: gcc  --version

X toolkit风格:使用单个连字符‘-’和关键字,并由X toolkit进行解析。比较复杂,最好不用。

2.4Linux软件开发的一般过程

2.5 gedit的使用

2.6 GNU GCC编译器的使用

2.7 GDB调试器

2.8 GNU make命令和Makefile文件

2.9 交叉开发环境的建立

2.10 常用的辅助工具

 Minicom

任务2  编程实现helloworld

任务3  编程实现多文件函数调用

任务4  使用gdb调试器

任务5  makefile的编写

发布了27 篇原创文章 · 获赞 3 · 访问量 5566

猜你喜欢

转载自blog.csdn.net/wxg_wuchujie88/article/details/91961807