LinuxGod

LinuxGod.net
Linux大神网——精选每一篇高品质的技术干货
  1. 首页
  2. 开源快讯
  3. 正文

linux中makefile文件 cdeveloper的第21篇原创技术文章建议横屏Makefile简介

2023年5月8日 296点热度

这是cdeveloper的第21篇原创

技术文章建议横屏

Makefile简介

Makefile是一个管理项目的配置文件,它主要有2个作用:

组织工程文件,编译成复杂的程序

安装及卸载程序

Makefile是被make这个程序执行的,当执行make时,假若发觉当前目录下有Makefile或则makefile文件,这么make命令都会按照这个文件的内容来找到相关的文件,之后去执行编译,链接,安装,卸载等操作,这就实现了使用make+Makefile来管理项目的功能。

这篇文章主要是介绍编撰Makefile的基础句型,帮助你还能编撰和理解通常的Makefile文件。

怎么系统的学习Makefile

想要系统的学习Makefile,须要2个条件:

Makefile官网:

大量练习编撰Makefile:想要系统学习,必须自己练习

由于make是GNU开发的开源软件,所以官网的资料可以说是最好的,这也是开源的力量,这篇文章只是带你入门,想要精通还要自己努力。

make的工作流程

在学习Makefile句型之前,我们先来学习下make是怎样解析Makefile文件的,主要分为下边4个步骤:

在当前目录下查找Makefile或则makefile的文件

找到然后,解析并得到最终要生成的目标文件

按照时间戳生成目标文件

递归去找寻其他目标文件的依赖文件,并递归生成

只须要了解这个步骤即可,这是为帮助你理解执行make后发生了哪些事情,清楚自己在做些哪些。

第一个Makefile

我们先写一个最简单的Makefile来熟悉编译,执行,清除,安装,卸载HelloWorld的操作,借以来熟悉通用的过程。

编撰hello.c

这个程序复印HelloWorld,十分简单:

#include 

int main(void) {
   printf("Hello World!n");
   return 0; }

编撰Makefile

这个Makefile其中包含的就是基本的gcc编译指令和一些shell指令:

hello:
    gcc hello.c -o hello

clean:    rm ./hello

install:    cp ./hello /usr/local/bin/hello

uninstall:    rm /usr/local/bin/hello

注意:使用Table键来缩进,否则会出现句型错误!

编译

如今有了Makefile,我们就可以直接在终端键入make来编译啦:

make
# make 之后打印的信息
gcc hello.c -o hello

我们看见只有一条复印信息,就是我们写的那条编译指令linux模拟,联想到我们自动编译他人的软件时,我们也是键入make之后屏幕就被一大串信息刷屏了,虽然这些信息跟这个本质上是一样,也是Makefile中的指令。

执行

执行./hello:

./hello
# 结果
Hello World!

可见这些方式愈加简单了,除了这般,还可以很容易清除可执行文件。

清除

还记得我们在Makefile中写了一个clean:吗,它下边还有一条删掉文件的指令,我们在终端键入:

make clean
# make clean 打印的信息
rm ./hello

linux中如何下载文件_linux中makefile文件_linux中文件解压缩

可以看见makeclean帮助我们删掉了hello,是不是非常便捷,之后再也不用敲那一大串gcc编译命令和自动删掉文件了,效率顿时又提高了。

安装

还记得使用sudomakeinstall来安装程序吗?我们也在终端键入下边的命令:

sudo make install
# 提示输入 root 密码
[sudo] password for orange: 
cp ./hello /usr/local/bin/hello
# 直接执行 hello
hello
# 输出
Hello World!

可以看出安装的过程似乎就是拷贝程序的过程。

卸载

卸载使用sudomakeuninstall,我们卸载hello:

# 卸载
sudo make uninstall
rm /usr/local/bin/hello
# 再次执行 hello,提示没找到即已经删除
bash: /usr/local/bin/hello: No such file or directory

至此,我们早已了解使用一个简单的Makefile来编译,清除,安装,卸载程序的事例,下边就来学习一些常用的Makefile句型吧。

Makefile基础句型

先来瞧瞧Makefile的编撰规则。

Makefile编撰规则

Makefile由若干条规则组成linux中makefile文件,规则格式如下:

目标(target): 依赖(prerequisites)
    命令(command)

比如:

main : main.o
    gcc main.o -o main
main.o : main.c
    gcc -c main.c -o main.o

其中main是最后生成的目标文件,main.o是依赖文件,gccmain.o-omain是编译命令,要注意的是main.o是由main.c生成的,所以还须要一条编译main.c生成main.o的规则,这种依赖关系规则共同组成了最后的Makefile。

Makefile变量

Makefile的变量分为3类:

用户自定义变量

预定义变量

环境变量

1.用户自定义变量

定义格式如下:

VAR_NAME = var_value

使用$(VAR_NAME)来引用变量,例如:

file_name = hello.chello:
    gcc $(file_name) -o hello

2.预定义变量

Makefile常见的预定义变量有下边这种:

我们可以直接使用或则重新定义这种变量,来看个使用CFLAGS和CC的事例:

CFLAGS = -g
CC = gcc

hello:    $(CC) $(CFLAGS) hello.c -o hello

这句编译指令就相当于gcc-ghello.c-ohello,我们降低了[-g]编译参数,来瞧瞧实际make的疗效:

make
# make 后的效果
gcc -g hello.c -o hello

3.环境变量

Makefile常用的环境变量有下边这种:

这儿我们以$^和$@为例:

hello : hello.o 
    gcc $^ -o $@
hello.o : hello.c
    gcc -c hello.c

瞧瞧make的结果:

make
# 一共执行了 2 条指令 gcc -c hello.c gcc hello.o -o hello

可以发觉$^=hello.o,$@=hello,符合这两个预定义变量的定义。

Makefile伪目标

先来看一个伪目标:

.PHONY: installinstall:
    cp hello /usr/local/bin/hello

伪目标install表示虽然当前文件夹内有install这个文件,而且make执行的依然是Makefile内部的install,不会使用外部的文件,相当于进行了一个内部封装。

Makefile包含

一个Makefile可以包含另一个Makefile,须要使用include指令,比如:

include dir/Makefile

这儿我们包含了当前目录下dir下的Makefile文件。

Makefile嵌套

在小型的项目中,我们常常须要一个Makefile来嵌套调用另一个目录下的Makefilelinux防火墙设置,这是可以使用下边的指令:

submake:
    cd dir && gcc hello.c -o hello

意思是先步入dir,然后执行前面的编译指令。比如我们在dir目录下新建hello.c,在上一级目录下使用前面的命令作为Makefile,我们来make:

make
# 结果
cd dir && gcc hello.c -o hello

Makefile条件判定

在Makefile中也可以进行条件判定,格式如下:

ifeq
    ...
else
    ...
endif

注意:上面不能用table分隔,来看一个反例:

CC = gcc
hello:  
ifeq ($(CC),gcc)
    gcc hello.c -o $@
else
    gcc hello.c -o hello2
endif

意思很容易理解,当CC=gcc时编译的输出文件名为hello,否则为hello2,我们瞧瞧make的结果:

# CC = gcc
make
gcc hello.c -o hello
# CC != gcc
make
gcc hello.c -o hello2

可以看见输出文件名是不同的,说明判定是有效的。

Makeifle管理命令

Makefile有几个管理命令须要了解:

我们这儿介绍下上面两个:

例如,我们在dir目录下放了hello.c和Makefile2个文件,使用下边的shell命令来在上一级目录编译:

make -C dir/
# make 结果
make: Entering directory '/home/orange/Desktop/Makefile/hello/dir'
gcc hello.c -o hello2
make: Leaving directory '/home/orange/Desktop/Makefile/hello/dir'

可以看见make先步入这个dir目录,然后编译,之后退出。

我们可以使用[-f]指定一个文件作为Makefile,比如:

make -f cdeveloper.mk
gcc hello.c -o hello

cdeveloper.mk内容就是普通Makefile的内容,只是名子变了而已,其实名子你可以随便改linux中makefile文件,而且内容必须符合Makefile句型。

结语

通过这篇文章,我们学习了Makefile的基础句型,假如须要愈发系统的学习,建议你看GNUMakefile的官方文档,那才是最好最权威的学习资料。

看官网的英语文档,除了才能学到知识,能够锻练英语水平,这是再好不过了事了,不过你须要有毅力,不能怕困难。

最后,感谢你的阅读,我们上次再会:)

随手点赞,手留余香

·END·

坚持技术原创

技术·生活·职场

个人主页:

本作品采用 知识共享署名 4.0 国际许可协议 进行许可
标签: linux系统 linux编译 makefile 编译程序
最后更新:2023年5月8日

Linux大神网

每日更新,欢迎收藏♥ 不积跬步无以至千里,加油,共勉。

点赞
< 上一篇
下一篇 >

Linux大神网

每日更新,欢迎收藏♥
不积跬步无以至千里,加油,共勉。

最新 热点 随机
最新 热点 随机
Ubuntu上安装SMplayer.6.10-PPA源在CentOS5.5下安装使用 centos启动图形界面的方法.x1,关闭界面 Linux下进程与线程概念重构 Linux中的十大开源播放器C编写 多进程和多线程的区别,你知道几个? Linux发行版中可用的7款最佳开源视频播放器 Linux系统安装网卡驱动的具体操作流程进行说明 如何在Linux上安装视频播放器installvlc 晚上暴露于蓝光,睡眠质量大打折扣 如何安装便携式WiFi驱动程序?360wifi驱动的教程 CentOS云服务器搭建网站和CentOS搭建DNS解析服务 如何在linux上创建一个用户,减少不必要的沟通成本 如何在Linux系统中查看CPU信息使用lscpu命令行 linux服务器搭建ftp的6下安装vsftpd步骤及步骤 贵州工业职业技术学院求职意向期望工作地--诚聘英才 实验1Linux安装实验掌握虚拟机的使用 Linux系统tar命令的使用方法及使用命令教程 linux 开源nas系统 杰和科技NAS服务器媒体见面会在京召开 Android与Linux开发大不同 Linux系统软件安装包:自己动手,安装不用愁
嵌入式Linux操作系统学习规划+LINUX路线,主攻江苏电信天翼校园客户端故障指引及解决办法(101)英特尔GMAGMA950显卡驱动程序/WIN8/8.1电信校园网宽带用USB数据线共享给电脑无线上网国防科大开源操作系统:它只是一个吉祥的象征10个常用Linux文本查看命令及其详细说明和使用示例Linux嵌入式系统内核裁剪与定制方法的介绍情况淘宝教育热卖C语言编程开发C++程序设计零基础入门课程从CPU、内存、硬盘、显卡等这些方面安装Linux系统的最低配置Linux通过chkconfig设置开机启动服务创建的几种常见方式(技术分析)Linux多线程的使用与操作系统的区别通常rar命令由一个主命令加若干选项(可选)构成RedHatLinux中自动运行程序中的应用linux 读写文件 关于Linux内核的神秘面纱,你知道几个?使用wget实用程序的有用命令行工具的使用怎么设置linux开机项自启动?方式是怎样的?嵌入式Linux应用层与驱动层要想学习关于Linux内核的交叉编译步骤和方法:步骤、方法STM32嵌入式linux开发流程及应用程序分析-STMlinux下有哪些文件在介绍lsof命令实用用法介绍?
linux服务器搭建ftp的6下安装vsftpd步骤及步骤 会话初始协议(SIP协议)的开发和交叉编译环境 查看动态库版本查找gcc生成的最新动态库方法 bin文件安装及安装过程中出现的常见错误原因分析 在Linux服务器中安装Web面板,老左怎么办? 嵌入式Linux系统的特点及特点分析-苏州安嘉 Linux系统发行版的一种方法,除此以外 1.任务描述现在你已经学会了如何创建一个新用户和删除一个 为什么我们还要使用一键DD重装/更换系统呢?? 【指南】Linux中网络接口卡的10种方法使用 php入门到就业线上直播课:linux同步时间的设置 深入理解Unix编程的必备资源之一:Unix系统编程 【中信建投】供应MXNTP10系列采用北斗卫星时钟信号 101教育PPTLinux系统命令及其使用详解(大全)电脑钢琴超级老师 Linux下中文乱码具体处理方法是什么?的人对电脑的操作 linux如何用u盘安装系统教程?(linux) 8个技巧让你成为一个超强的Linux终端用户 Oracle10G数据库系统备份数据的备份时间与系统时间的关系 小白在阿里云云服务器上如何发布自己的网站(建站|详细) deb文件后无法通过Ubuntu20.04的软件中心安装?你不是唯一遇到此问题的人
标签聚合
文件 内核 应用 linux系统 命令 虚拟机 操作 文件目录 linux服务器 软件
书籍
课程
技术群
技术干货大合集↓
  • 2023年9月 / 90篇
  • 2023年8月 / 93篇
  • 2023年7月 / 94篇
  • 2023年6月 / 90篇
  • 2023年5月 / 93篇
  • 2023年4月 / 90篇
  • 2023年3月 / 129篇
  • 2023年2月 / 84篇
  • 2023年1月 / 161篇
  • 2022年12月 / 187篇
  • 2022年11月 / 76篇
友情链接:

Linux书籍 | Linux命令 | Linux系统 | RHCE红帽认证 | Linux软件 | Linux教程 | CentOS系统 | Linux内核 | Linux服务器 | Linux大神 | IT资源

COPYRIGHT © 2023 linuxgod.net ALL RIGHTS RESERVED.