Makefile和shell
一、 Makefile
描述了整个工程的编译、链接规则。当源码文件比较多的时候就不适合通过输入 gcc 命令来编译,Makefile 文件描述了编译哪些源码文件、如何编译,每次需要编译工程时只需要使用这个文件就行了。
1.makefile的基本语法
makefile功能强大,makefile的语法与shell脚本相似,首先makefile大概有三种元素,分别是,目标,依赖和动作,目标是一个代号,即你要完成什么,依赖是你完成这个目标所需要的文件,进程,或其他目标等等,动作就是我们为了实现这个目标,让系统执行的操作,比如gcc,rm -rf等命令。
#注意:Makefile 中空出来的部分用 Tab 键,不能用空格;注释用 “#”,不能用 “//”。 #赋值语法: VAR = testvalue #var变量被强制赋值为testvalue。 VAR ?=testvalue1 #若var未被赋值,那么就赋值为testvalue1,若在此语句前已经赋值,那么就忽略。 VAR +=testvalue2 #在之前定义的var值后面追加testvalue2值,例如之前var已经被赋值testvalue, #此时+=后,var的值就变成了testvaluetestvalue2。 #总目标,makefile中的第一个目标就是总目标,后面跟的是实现这个目标需要的依赖。 #依赖可以是工作路径下的某个文件,也可以是某个目标,若依赖某目标,则需要先执行这个被依赖的目标。 #例如总目标all就会先执行target1中的动作,结束后接着执行all目标的动作。 all: depend1 depend2 target1 [TAB]action1 #这个目标要实行什么动作 [TAB]action2 #动作前必须是TAB target1: [TAB]action1 [TAB]action2 #运行makefile时,默认会打印执行了的动作,如果不需要打印这些信息,可以将@加在action之前,便不会打印action了。若要取出某个变量中的值,可以用${变量}的形式,取出其中的值。
使用 Makefile 的方法:直接在命令行中输入 “make”,make命令会在当前目录下按顺序找寻文件名为“GNUmakefile”、“makefile”、“Makefile”的文件,找到后就解释并执行该文件,如果找不到就提示错误并退出。一般Makeifle文件名我们会用Makefile或makefile,而不会使用GNUmakefile。
APPNAME=server LIBPATH=`pwd`/../lib/ CFLAGS+=-I${LIBPATH} CFLAGS+=-I ../../../sqlite/include/ LDFLAGS+=-L${LIBPATH} LDFLAGS+=-L ../../../sqlite/lib/ CC=gcc all: ${CC} ${CFLAGS} main.c -o ${APPNAME} ${LDFLAGS} -lmy_server -lsqlite3 clean: rm -f ${APPNAME} run: export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:LIBPATH && ./${APPNAME} -p 12345
另外还需要注意的是:makefile里每一个指令是一个独立的进程,export这一行是一个进程,export是临时改变环境变量,它结束了以后,对于下一行执行的这个进程来说,环境变量其实并没有改变
二、shell 脚本
1、什么是shell脚本
我们如果要实现一个需求,需要在 shell 窗口中输入很多命令,可以直接在 shell 窗口中输入,但每次用到相同的需求时都需要重新敲,我们可以把这些命令记录在一个文档中,然后去执行这个文档中的命令,这样就能一步操作完成。
1、shell 脚本就是一些命令的集合,它是个纯文本文件,命令从上而下,一行一行的开始执行。
2、shell 脚本提供数组、循环、条件判断等功能。
3、shell 脚本扩展名为 .sh。
注意:shell 脚本第一行一定要为: #!/bin/bash -------> 表示使用 bash
2、Shell脚本如何运行
对于脚本文件,我们有两种执行方式:
sh script_name.sh ./script_name.sh
Linux 中一切皆文件,脚本/命令/程序都是一个文件,文件作为一个对象,具有权限的属性。在执行别人发送或从网上下载的脚本时可能会遇到权限问题,赋予执行权限可解决:
chmod +x xxx.sh
需要注意的是,当我们使用Shell脚本的时候,Shell脚本的路径需要被包含在PATH路径当中。我们可以用PATH=$PATH:路径名来添加路径名(通过命令行添加的时候是临时生效的,而不是永久生效)。
#永久修改 $PATH 需要在 .bashrc 或 .bash_profile 中添加 export PATH=“$$PATH:/new/path”
三、Makefile 和 shell 脚本的区别
1、通配符区别
shell 中通配符 * 表示所有的字符
Makefile 中通配符 % 表示所有的字符
2、shell 不允许 “=” 号两边有空格;Makefile 允许变量赋值时,“=” 号两边留空格。
3、命令和变量的引用
shell $() 放命令,${} 放变量 Makefile $() 和 ${} 都能进行取变量值
四、Makefile 和 shell文件互相调用
1、shell 文件内调用makefile文件
#!/bin/bash make export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:`pwd`/../lib/ ./server -p 12345
2、makefile文件内调用shell 文件
APPNAME=server LIBPATH=`pwd`/../lib/ CFLAGS+=-I${LIBPATH} CFLAGS+=-I ../../../sqlite/include/ LDFLAGS+=-L${LIBPATH} LDFLAGS+=-L ../../../sqlite/lib/ CC=gcc all: ${CC} ${CFLAGS} main.c -o ${APPNAME} ${LDFLAGS} -lmy_server -lsqlite3 clean: rm -f ${APPNAME} run: #export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:LIBPATH && ./${APPNAME} -p 12345 ./test.sh
本文作者:梨子Li
本文链接:https://www.cnblogs.com/LiBlog--/p/18072903
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)