本文主要描述Ubuntu18.04系统下C语言程序的开发流程,具体包括Ubuntu系统安装、虚拟机网络参数的设置、Ubuntu的常用命令、vi/vim的使用、nano的使用、将系统自带的源更换为国内软件源、hello world的编译运行、C语言程序在不同系统环境下实现方式的对比、Makefile的使用
目录
一、环境实验搭建
本文主要是利用Vmware软件实现Ubuntu系统下的C语言程序,需要用到VMware Workstation Pro以及Ubuntu 18.04镜像文件。
1、安装VMware workstation软件
通过安装包安装VMware workstation软件,安装完成后通过VMKeygen获得并输入许可证,在D盘创建以虚拟机命名的文件夹,在文件夹中建立共享文件夹。
在软件中,修改虚拟机默认位置,点击编辑->首选项->工作区 ,将虚拟机的默认位置改为D:\虚拟机。
修改共享虚拟机位置,点击共享虚拟机(已弃用)->更改设置,将共享虚拟机位置改为D:\虚拟机\共享。
此时可能会一直显示正在检索共享虚拟机的位置…,可能是因为计算机名中带有汉字引起的,此时需要修改重命名这台电脑,只需要点击设置->系统->系统信息->重命名这台电脑,将计算机名改为全英文并重启计算机,此时共享虚拟机就可以正常启用了
这样就基本上完成了Vmware软件的设置了。
2、安装Ubuntu server18.04
1、下载Ubuntu sever18.04镜像文件,在VMware workstation中,创建新的虚拟机
2、选择自定义,点击下一步
3、选择虚拟硬件兼容性workstation16x,点击下一步
4、选择Linux客户机操作系统,版本为Ubuntu64位,点击下一步
5、设置虚拟机名称为Ubuntu server18.04,存储在对应位置,点击下一步
6、设置处理器数量为1和每个处理器内核数量为4(处理器数量和内核数量相乘必须小于物理机的逻辑处理器数量,物理机的逻辑处理器可以在 任务管理器->性能 中查看),点击下一步
7、分配内存1GB,点击下一步
8、选择虚拟机网络类型为NAT,点击下一步
9、选择I/O控制器类型,SCSI控制器选为LSL Logic (L),点击下一步
10、选择磁盘类型,虚拟磁盘类型选为SCSI(S),点击下一步
11、选择创建新的虚拟磁盘,点击下一步
12、 最大磁盘大小选择为20GB,选择将虚拟磁盘拆分成多个文件,点击下一步
13、确定磁盘文件名,点击下一步
14、选择自定义设置,选择新的磁盘镜像文件并添加,则创建完成。
15、接着打开虚拟机完成后续设置就可以了
注意:
1.在Install OpenSSH server处一定要勾选
2.在Ubuntu安装完成后,登录用户并输入 sudo su 命令并再次输入密码获取root权限,输入 apt update 命令更新软件列表和软件包
3.建议上诉设置完成后创建快照,便于在后续操作出现失误时回到该结点位置,依次点击 虚拟机->快照->拍摄快照 完成快照拍摄
二、设置网络参数
通过虚拟网络编辑器修改虚拟机网络,点击 更改设置 获得管理员权限,将 VMnet0 设置为 桥接模式 ,将 VMnet1 设置为 仅主机模式 ,将 VMnet8 设置为 NAT模式 。
三、Ubuntu常用命令
主要涉及到后续操作可能涉及的命令。
1、cp命令
功能
Linux cp(英文全拼:copy file)命令主要用于 复制文件或目录 。
命令参数详情
cp命令的语法:
cp [options] source dest或cp [options] source… directory
参数说明:
命令 | 作用 |
---|---|
-a | 此选项通常在复制目录时使用,它保留链接、文件属性,并复制目录下的所有内容。其作用等于dpR参数组合 |
-d | 复制时保留链接。这里所说的链接相当于 Windows 系统中的快捷方式 |
-f | 覆盖已经存在的目标文件而不给出提示 |
-i | 与-f选项相反,在覆盖目标文件之前给出提示,要求用户确认是否覆盖,回答y时目标文件将被覆盖 |
-p | 除复制文件的内容外,还把修改时间和访问权限也复制到新文件中 |
-r | 若给出的源文件是一个目录文件,此时将复制该目录下所有的子目录和文件 |
-l | 不复制文件,只是生成链接文件 |
应用实例
2、cd命令
功能
Linux cd(英文全拼:change directory)命令用于 切换当前工作目录 。
命令参数详情
cd命令的语法:cd [dirName]
dirName:要切换的目标目录。
其中 dirName 表示法可为绝对路径或相对路径。若目录名称省略,则变换至使用者的 home 目录 (也就是刚 login 时所在的目录)。
另外,~ 也表示为 home 目录 的意思, . 则是表示目前所在的目录, . . 则表示目前目录位置的上一层目录。
应用实例
跳到 /usr/bin/ : cd /usr/bin
跳到自己的 home 目录 : cd ~
跳到目前目录的上上两层 : cd . ./. .
3、pwd命令
功能
Linux pwd(英文全拼:print work directory) 命令用于 显示工作目录 。
执行 pwd 指令可立刻得知您目前所在的工作目录的绝对路径名称。
命令参数详情
pwd命令的语法:pwd [参数]
参数说明:
命令 | 作用 |
---|---|
- -help | 在线帮助 |
- -version | 显示版本信息 |
应用实例
查看当前所在目录:pwd
4、exit命令
功能
Linux exit命令用于 退出目前的shell。
执行exit可使shell以指定的状态值退出。若不设置状态值参数,则shell以预设值退出。状态值0代表执行成功,其他值代表执行失败。exit也可用在script,离开正在执行的script,回到shell。
命令参数详情
exit命令的语法:exit [状态值]
应用实例
退出用户:
5、ifconfig命令
功能
Linux ifconfig命令用于 显示或设置网络设备 。ifconfig可设置网络设备的状态,或是显示目前的设置。
命令参数详情
ifconfig命令的语法:
ifconfig [网络设备][down up -allmulti -arp -promisc][add<地址>][del<地址>][<hw<网络设备类型><硬件地址>][io_addr<I/O地址>][irq<IRQ地址>][media<网络媒介类型>][mem_start<内存地址>][metric<数目>][mtu<字节>][netmask<子网掩码>][tunnel<地址>][-broadcast<地址>][-pointopoint<地址>][IP地址]
参数说明:
参数 | 解释 |
---|---|
add<地址> | 设置网络设备IPv6的IP地址 |
del<地址> | 删除网络设备IPv6的IP地址 |
down | 关闭指定的网络设备 |
<hw<网络设备类型><硬件地址> | 设置网络设备的类型与硬件地址 |
io_addr<I/O地址> | 设置网络设备的I/O地址 |
irq<IRQ地址> | 设置网络设备的IRQ |
media<网络媒介类型> | 设置网络设备的媒介类型 |
mem_start<内存地址> | 设置网络设备在主内存所占用的起始地址 |
metric<数目> | 指定在计算数据包的转送次数时,所要加上的数目 |
mtu<字节> | 设置网络设备的MTU |
netmask<子网掩码> | 设置网络设备的子网掩码 |
tunnel<地址> | 建立IPv4与IPv6之间的隧道通信地址 |
up | 启动指定的网络设备 |
-broadcast<地址> | 将要送往指定地址的数据包当成广播数据包来处理 |
-pointopoint<地址> | 与指定地址的网络设备建立直接连线,此模式具有保密功能 |
-promisc | 关闭或启动指定网络设备的promiscuous模式 |
[IP地址] | 指定网络设备的IP地址 |
[网络设备] | 指定网络设备的名称 |
应用实例
启动或关闭指定网卡:
ifconfig eth0 down
ifconfig eth0 up
为网卡配置和删除IPv6地址
ifconfig eth0 add 33ffe:3240:800:1005::2/ 64 //为网卡设置IPv6地址
ifconfig eth0 del 33ffe:3240:800:1005::2/ 64 //为网卡删除IPv6地址
6、ping命令
功能
Linux ping 命令用于 检测主机 。
执行 ping 指令会使用 ICMP 传输协议,发出要求回应的信息,若远端主机的网络功能没有问题,就会回应该信息,因而得知该主机运作正常。
命令参数详情
ping命令的语法:
ping [-dfnqrRv][-c<完成次数>][-i<间隔秒数>][-I<网络界面>][-l<前置载入>][-p<范本样式>][-s<数据包大小>][-t<存活数值>][主机名称或IP地址]
参数说明:
参数 | 作用 |
---|---|
-d | 使用Socket的SO_DEBUG功能 |
-c <完成次数> | 设置完成要求回应的次数 |
-f | 极限检测 |
-i<间隔秒数> | 指定收发信息的间隔时间 |
-I<网络界面> | 使用指定的网络接口送出数据包 |
-l<前置载入> | 设置在送出要求信息之前,先行发出的数据包 |
-n | 只输出数值 |
-p<范本样式> | 设置填满数据包的范本样式 |
-q | 不显示指令执行过程,开头和结尾的相关信息除外 |
-r | 忽略普通的Routing Table,直接将数据包送到远端主机上 |
-R | 记录路由过程 |
-s<数据包大小> | 设置数据包的大小 |
-t<存活数值> | 设置存活数值TTL的大小 |
-v | 详细显示指令的执行过程 |
-w deadline | 在 deadline 秒后退出 |
-W timeout | 在等待 timeout 秒后开始执行 |
应用实例
7、sudo命令
功能
Linux sudo命令 以系统管理者的身份执行指令 ,也就是说,经由 sudo 所执行的指令就好像是 root 亲自执行。
命令参数详情
sudo命令的语法:
sudo -V
sudo -h
sudo -l
sudo -v
sudo -k
sudo -s
sudo -H
sudo [ -b ] [ -p prompt ] [ -u username/#uid] -s
sudo command
参数说明:
命令 | 作用 |
---|---|
-V | 显示版本编号 |
-h | 会显示版本编号及指令的使用方式说明 |
-l | 显示出自己(执行 sudo 的使用者)的权限 |
-v | 因为 sudo 在第一次执行时或是在 N 分钟内没有执行(N 预设为五)会问密码,这个参数是重新做一次确认,如果超过 N 分钟,也会问密码 |
-k | 将会强迫使用者在下一次执行 sudo 时问密码(不论有没有超过 N 分钟) |
-b | 将要执行的指令放在背景执行 |
-p prompt | 可以更改问密码的提示语,其中 %u 会代换为使用者的帐号名称, %h 会显示主机名称 |
-u username/#uid | 不加此参数,代表要以 root 的身份执行指令,而加了此参数,可以以 username 的身份执行指令(#uid 为该 username 的使用者号码) |
-s | 执行环境变数中的 SHELL 所指定的 shell ,或是 /etc/passwd 里所指定的 shell |
-H | 将环境变数中的 HOME (家目录)指定为要变更身份的使用者家目录(如不加 -u 参数就是系统管理者 root ) |
command | 要以系统管理者身份(或以 -u 更改为其他人)执行的指令 |
应用实例
显示出自己的权限:
8、 passwd命令
功能
Linux passwd命令用来更改使用者的密码
命令参数详情
passwd命令的语法:passwd [-k] [-l] [-u [-f]] [-d] [-S] [username]
必要参数:
参数 | 作用 |
---|---|
-d | 删除密码 |
-f | 强迫用户下次登录时必须修改口令 |
-w | 口令要到期提前警告的天数 |
-k | 更新只能发送在过期之后 |
-l | 停止账号使用 |
-S | 显示密码信息 |
-u | 启用已被停止的账户 |
-x | 指定口令最长存活期 |
-g | 修改群组密码 |
-i | 口令过期后多少天停用账户 |
选择参数:
参数 | 作用 |
---|---|
- -help | 显示帮助信息 |
- -version | 显示版本信息 |
应用实例
修改用户密码:
显示账号密码信息:
四、vi/vim的使用
1、vi/vim概述
vi(visual editor)编辑器通常被简称为vi,它是Linux和Unix系统上最基本的文本编辑器,类似于Windows 系统下的notepad(记事本)编辑器。
vim是一个由vi增强版的编辑工具,是一个开源免费的软件,它功能丰富,使用快捷,应用广泛。vim也是大多数linux系统上的默认编辑器,用于对文本文件进行建立,显示,编辑,删除,复制等操作,需要用命令进行控制。
vim工作模式可分为三种,即——命令模式,编辑模式,末行模式
1. 命令模式:可以用vim加上任意一个已经存在或是想创建的文件名,如果系统还不存在该文件,就意味着创建文件,如果系统存在该文件,就意味着编辑该文件。此时就可以进入vim的默认模式—命令模式。此时vim等待输入正确的命令,键入的每一个字符都会当作命令来处理。
2. 插入模式:在进入命令模式之后,按下 a i o等键可进入插入模式。进入插入模式后可以对文件进行编辑,左下角出现INSERT
3. 末行模式:在进入末行模式前先按下【Esc】确认处于命令模式后,按下冒号【:】,即可进入末行模式
2、常用操作:
1、进入Vim:
在系统光标提示符后,输入vim及文件名后,回车,进入Vim编辑画面
vim 1.c
注意:进入vim之后,是处于命令行模式,要切换到插入模式,才能够输入文字
2、切换至插入模式编辑文件:
在命令行模式下按一下字母「i」就可以进入插入模式,这时候就可以开始输入了
3、插入模式切换到命令行模式:
在插入模式下,按一下「ESC」键即可
4、退出vim及保存文件:
在命令行模式下,按冒号「:」键,进入底行模式
常见底行模式下的命令行:
命令 | 作用 |
---|---|
:w filename | 文件以filename为文件名保存 |
:wq | 文件存盘并退出vim |
:q | 文件不存盘并退出vim |
:q! | 文件不存盘强制退出vim |
5、命令行模式下的功能键
(1)从命令行模式切换为插入模式的三种方式:
项目 | Value |
---|---|
「 i 」 | 从当前光标位置进入插入模式 |
「a 」 | 从当前光标位置的下一个字符进入插入模式 |
「o 」 | 从当前光标位置的下一行进入插入模式 |
(2)移动光标:
小写英文字母「h」「j」「k」「l」,分别控制光标左、下、上、右移一格
(3)行尾追加:
不管光标在该行的什么位置,直接按大写字母「A」即可
(4)从当前光标处删除到行末:把光标停留在需要删除的句子前面,依次按下「d」「$」即可
(5)快速跳转到行首:
按下数字「0」,即可
(6)撤销更改:
按小写字母「u」,撤销上一步的更改操作
按大写字母「U」,撤销整行的更改操作
「Ctrl+R」撤销上一步「撤销操作」
五、nano的使用
1、nano概述
nano是一个字符终端的文本编辑器,有点像DOS下的editor程序。它比vi/vim要简单得多,比较适合Linux初学者使用。某些Linux发行版的默认编辑器就是nano。
nano命令可以打开指定文件进行编辑,默认情况下它会自动断行,即在一行中输入过长的内容时自动拆分成几行,但用这种方式来处理某些文件可能会带来问题,比如Linux系统的配置文件,自动断行就会使本来只能写在一行上的内容折断成多行了,有可能造成系统不灵了。因此,如果你想避免这种情况出现,就加上-w选项吧。
2、语法格式:
Nano [选项] [[+行,列]文件名]…
光标控制:
移动光标:使用用方向键移动
选择文字:按住鼠标左键拖到
复制、剪贴和粘贴:
复制一整行:Alt+6
剪贴一整行:Ctrl+K
粘贴:Ctrl+U
如果需要复制/剪贴多行或者一行中的一部分,先将光标移动到需要复制/剪贴的文本的开头,按Ctrl+6(或者Alt+A)做标记,然后移动光标到 待复制/剪贴的文本末尾。这时选定的文本会反白,用Alt+6来复制,Ctrl+K来剪贴。若在选择文本过程中要取消,只需要再按一次Ctrl+6。
搜索:
按Ctrl+W,然后输入你要搜索的关键字,回车确定。这将会定位到第一个匹配的文本,接着可以用Alt+W来定位到下一个匹配的文本。
翻页:
Ctrl+Y到上一页
Ctrl+V到下一页
保存:
使用Ctrl+O来保存所做的修改
退出:
按Ctrl+X
如果你修改了文件,下面会询问你是否需要保存修改。输入Y确认保存,输入N不保存,按Ctrl+C取消返回。如果输入了Y,下一步会让你输入想要保存的文件名。如果不需要修改文件名直接回车就行;若想要保存成别的名字(也就是另存为)则输入新名称然后确定。这个时候也可用Ctrl+C来取消返回。
六、将系统自带的源更换为国内软件源
ubuntu自带的软件源服务器在国外,国内访问卡,更换成阿里云源提高apt 安装速度。
1、查看ubuntu的Codename
lsb_release -a
2、备份系统源
cd /etc/apt
sudo cp sources.list sources.list.bak
输入密码获得管理员权限,备份系统源
3、写入阿里云的源
nano sources.list
长按 Ctrl+K 将sources.list里面的文字全部删除。
下面源信息中$Codename为第一步中系统的Codename,用记事本批量替换即可。
deb http://mirrors.aliyun.com/ubuntu/ $Codename main multiverse restricted universe
deb http://mirrors.aliyun.com/ubuntu/ $Codename-backports main multiverse restricted universe
deb http://mirrors.aliyun.com/ubuntu/ $Codename-proposed main multiverse restricted universe
deb http://mirrors.aliyun.com/ubuntu/ $Codename-security main multiverse restricted universe
deb http://mirrors.aliyun.com/ubuntu/ $Codename-updates main multiverse restricted universe
deb-src http://mirrors.aliyun.com/ubuntu/ $Codename main multiverse restricted universe
deb-src http://mirrors.aliyun.com/ubuntu/ $Codename-backports main multiverse restricted universe
deb-src http://mirrors.aliyun.com/ubuntu/ $Codename-proposed main multiverse restricted universe
deb-src http://mirrors.aliyun.com/ubuntu/ $Codename-security main multiverse restricted universe
deb-src http://mirrors.aliyun.com/ubuntu/ $Codename-updates main multiverse restricted universe
复制上面的文本,用记事本打开,点击编辑->替换,在搜索栏输入$Codename,下方输入开始查询到的Codename,如18.04就是bionic,点击全部替换,并将记事本中替换后的文本复制到剪切板。
在VMware里面依次点击编辑->粘贴,文本会自动输入到sources.list中
点击Ctrl+x,输入y确认退出,然后点击一次回车,就成功将阿里源写入了sources.list
4、执行更新
apt-get update
在命令行输入 apt-get update ,完成软件更新
七、gcc的使用
1、gcc概述
GCC(GNU Compiler Collection,GNU编译器套件),是由 GNU 开发的编程语言编译器。GCC 原名为 GNU C 语言编译器(GNU C Compiler),因为它原本只能处理 C语言。GCC 很快地扩展,变得可处理 C++。后来又扩展能够支持更多编程语言,如Fortran、Pascal、Objective-C、Java、Ada、Go以及各类处理器架构上的汇编语言等,所以改名GNU编译器套件(GNU Compiler Collection)。
2、gcc的基本用法
GCC最基本的用法是∶
gcc [options] [filenames]
其中options就是编译器所需要的参数,filenames给出相关的文件名称。在使用GCC编译器的时候,我们必须给出一系列必要的调用参数和文件名称。
参数 | 作用 | 注意 |
---|---|---|
-c | 只编译,不链接成为可执行文件 | |
-o output_filename | 确定输出文件的名称为output_filename | 这个名称不能和源文件同名。如果不给出这个选项,gcc就给出预设的可执行文件a.out |
-g | 产生符号调试工具(GNU的gdb)所必要的符号资讯 | 想对源代码进行调试,必须加入这个选项 |
-O | 对程序进行优化编译、链接 | 编译、链接的速度相应地要慢一些 |
-O2 | 比-O更好的优化编译、链接 | 整个编译、链接过程会更慢。 |
-I dirname | 将dirname所指出的目录加入到程序头文件目录列表中 | 在预编译过程中使用的参数 |
-v | gcc执行时执行的详细过程,gcc及其相关程序的版本号 |
文件名 | 解释 |
---|---|
.c | C语言源代码文件 |
.a | 由目标文件构成的档案库文件 |
.C | C++源代码文件且必须要经过预处理 |
.h | 程序所包含的头文件 |
.i | C源代码文件且不应该对其执行预处理 |
.ii | C++源代码文件且不应该对其执行预处理 |
.m | Objective-C源代码文件 |
.mm | Objective-C++源代码文件 |
.o | 编译后的目标文件 |
.s | 汇编语言源代码文件 |
.S | 经过预编译的汇编语言源代码文件 |
注意:当[options]缺省时,gcc会将文件经预处理、汇编、编译并链接形成可执行文件。
3、gcc的执行过程
使用gcc由C语言源代码文件生成可执行文件需要经历预处理、编译、汇编和连接。
命令gcc首先调用cpp进行 预处理 ,在预处理过程中,对源代码文件中的文件包含(include)、预编译语句(如宏定义define等)进行分析。接着进行编译,根据输入文件生成以.o为后缀的目标文件。汇编过程是针对汇编语言的步骤,.S 为后缀的汇编语言源代码文件和汇编 .s 为后缀的汇编语言文件经过预编译和汇编之后都生成以 .o 为后缀的目标文件。当所有的目标文件都生成之后,gcc将所有的目标文件安排在可执行程序中的恰当的位置,同时,该程序所调用到的库函数也从各自所在的档案库中连到合适的地方。
4、下载gcc
当在命令行输入gcc
时,如果显示如下信息:
则表示未安装gcc,只需要根据提示在命令行输入sudo apt install gcc
,gcc就会在输入密码后找到gcc的安装包并提示安装信息,确认继续后就会自动安装到虚拟机上。此时输入gcc则会提醒no input files。
八、hello world的编译运行
1、编写源代码文件hello.c
在命令行输入 vim hello.c
创建源代码文件,点击 [i] 进入插入模式,在 hello.c 文件中输入源代码,代码编辑完成后输入 [Esc] 进入命令模式,此时我们需要输入:wq
保存代码并回到命令行。
2、生成可执行文件
步骤 | 命令 |
---|---|
预编译阶段 | gcc -E hello.c -o hello.i |
编译阶段 | gcc -S hello.i -o hello.s |
汇编阶段 | gcc -c hello.s -o hello.o |
链接阶段 | gcc hello.o -o hello |
经过上述操作后便生成执行可执行文件 hello.c
3、运行可执行文件
在命令行输入 ./hello
即可实现输出 Hello world!
至此,就实现了 在Ubuntu系统下用C语言编写一个简单的输出 hello word 的程序,并编译有、运行之 的任务
九、不同系统环境下实现C语言程序的对比
1、要求
编写一个主程序文件 main1.c 和一个子程序文件 sub1.c, 要求:子程序sub1.c 包含一个算术运算函数 float x2x(int a,int b),此函数功能为对两个输入整型参数做某个运算,将结果做浮点数返回;主程序main1.c,定义并赋值两整型变量,然后调用函数 x2x,将x2x的返回结果printf出来。
2、在ubuntu系统用gcc 命令行方式实现
编写sub1.c
x2x实现两个数相加
#include <stdio.h>
float x2x(int a, int b)
{
return a+b;
}
编写main1.c
#include <stdio.h>
int main()
{
int a=10,b=8;
float num=0;
num=x2x(a,b);
printf("%f\n",num);
return 0;
}
编译
gcc main1.c sub1.c -o main1
运行
./main1
3、在windows系统下用Visual studio 2019实现
编写sub1.c
#include <stdio.h>
using namespace std;
float x2x(int a, int b)
{
return a + b;
}
编写main1.c
#include <stdio.h>
#include "sub1.h"
using namespace std;
int main()
{
int a = 10, b = 8;
float num = 0;
num = x2x(a, b);
printf("%f\n", num);
return 0;
}
编写sub1.h
#pragma once
#ifndef _SUB1_H_
#define _SUB1_H_
float x2x(int a, int b);
#endif
调试
总结
在Ubuntu系统上通过 gcc命令 实现 main1.c 文件对 sub1.c 文件的调用只需要通过 gcc main1.c sub1.c -o main1
即可实现,而在Windows上通过 Visual Studio 来实现则需要另外编写 sub1.h来解决。在我看来,在Ubuntu系统上通过 gcc命令 实现一个.c文件对另一个.c文件的调用要比在Windows上通过 Visual Studio 上容易。
十、Makefile的使用
Makefile简介
makefile 文件中定义了一系列的规则来指定, 哪些文件需要先编译, 哪些文件需要后编译, 哪些文件需要重新编译, 甚至于进行更复杂的功能操作。makefile 需要配合 make 指令进行自动化编译。make 是一个命令工具,用来解释 makefile 文件中的代码,从而实现自动化编译。
安装Make
输入命令sudo apt-get install make
即可完成安装
makefile规则
target ... : prerequisites ...
command
...
...
目标:依赖
执行指令 ...
target是一个目标文件(所要生成的文件)
prerequisites就是,要生成那个target所需要的文件或是目标。
command也就是make需要执行的命令。(任意的Shell命令)
这是一个文件的依赖关系,也就是说,target这一个或多个的目标文件依赖于prerequisites中的文件,其生成规则定义在command中。
command一定要以Tab键开始,否则编译器无法识别command
编写makefile
输入vim makefile
,编辑makefile,编写完成后输入 [Esc]->:wq->Enter 保存并退出vim
main1: main1.o sub1.o
gcc -o main1 main1.o sub1.o
main1.o: main1.c sub1.c
gcc -c main1.c -o main1.o
sub1.o: sub1.c
gcc -c sub1.c -o sub1.o
编译并运行
命令行输入 make
进行编译,生成可执行文件main1,命令行输入./main1
运行可执行main1
总结
通过本次作业,我不仅复习了一些掌握了Linux的知识,还学习到不少新的知识。同时,在本次完成作业的过程中,我还认识到了自己Linux学习的不足与短板,希望在接下来的嵌入式系统的学习中,通过听讲和查询资料来不断完善自己的知识体系。
参考列表:
1.https://blog.csdn.net/qq_46467126/article/details/120279485?spm=1001.2014.3001.5502
2.markdown教程
3.Linux Vim编辑器的基本使用
4.Ubuntu 快速更换阿里源
5.gcc简介
6.gcc详解
7.Linux下gcc编译器的安装与使用
8.Makefile的介绍与工作原理