(这有点像一个堆栈的过程) 最终生成target文件 make 参数介绍 make 的参数有很多, 可以通过 make -h 去查看, 下面只介绍几个我认为比较有用的。...programB.c programC.c SRCS += programD.c 变量覆盖 override 目标变量 作用是使变量的作用域仅限于这个目标(target), 而不像之前例子中定义的变量,...输出执行的命令以及命令执行的结果, 出错的话停止执行 前缀 @ 只输出命令执行的结果, 出错的话停止执行 前缀 - 命令执行有错的话, 忽略错误, 继续执行 伪目标 伪目标并不是一个"目标(target...)", 不像真正的目标那样会生成一个目标文件....end make[1]: Leaving directory `/path/to/test/makefile' 主 Makefile end Makefile 隐含规则 这里只列一个和编译C相关的.
或者make targetfile ,但也有时你也许只想让make重编译某些文件,而不是整个工程,而又有的时候你有几套编译规则,想在不同的时候使用不同的编译规则,等等,本章节就是讲述如何使用make命令的使用...下面是的取值: a: 也就是all,输出所有的调试信息。(会非常的多) b: 也就是basic,只输出简单的调试信息。即输出不需要重编译的目标。...如果你只是想输出信息而不想执行makefile, 你可以使用“make -qp”命令。如果你想查看执行makefile前的预设变量和规则,你可以使用“make –p –f /dev/null”。...例如:%.c 表示以.c 结尾的文件名(文件名的长度至少为3),而s.%.c 则表示以s.开头,.c 结尾的文件名(文件名的长度至少为5)。...一旦规则被找到,就会执行其相当的命令,而此时,我们的自动化变量的值才会生成。
每个target.d文件的生成依赖于对应的target.c和*.h文件。当.d文件发生变化,则执行对应的make规则。 ?...当多个.d文件生成后,其中包含了各个依赖关系,使用include方法包括到文件中,如下包含了foo.d和bar.d。 其中的:.c=.d,将source中的.c替换为了对应的.d。...include的作用相当于C语言中的展开https://www.cnblogs.com/cuckoos/articles/5049984.html ? 换行说明 转义符换行,左边为输入,右边为输出。...其中第二部分的单双引号区别由bash控制而不是makefile。 ? 。。。。 ? ? 。。。。 ? ? 。。。。 ?....ONESHELL .ONESHELL定义后,在构建一个目标时,方法的所有行都将被赋予shell的一次调用,而不是单独调用每一行。
如果目标不是函数库文件(Unix下是[.a],Windows下是[.lib]),那么,其值为空。 $< 依赖目标中的第一个目标名字。...- make需要执行的命令 (任意的shell命令), Makefile中的命令必须以 [tab] 开头 显示规则 :: 说明如何生成一个或多个目标文件(包括 生成的文件, 文件的依赖文件, 生成的命令...), 而不像之前例子中定义的变量, 对整个Makefile都有效....命令区别如下: 不用前缀 :: 输出执行的命令以及命令执行的结果, 出错的话停止执行 前缀 @ :: 只输出命令执行的结果, 出错的话停止执行 前缀 - :: 命令执行有错的话, 忽略错误, 继续执行...隐含规则 这里只列一个和编译C相关的.
gcc根据选项的规则将输入文件编译生成适当的输出文件。 gcc的选项非常多,常用的选项,它们大致可以分为以下几类 。...6.2.2.2 输出选项 输出选项用于指定gcc的输出特性等,常用的选项有: (1)输出目标选项(-o filename) -o选项指定生成文件的文件名为filename。.../a.out $ 100 ask (2)输出所有警告选项(-Wall) 显示所有的警告信息,而不是只显示默认类型的警告。建议使用。... 会发现,它自动只重新编译生成我们修改源文件的目标文件.c和可执行文件。 ...这是因为Makefile中定义的只执行命令的目标与工作目录下的实际文件出现名字冲突。而Makefile中clean目标没有任何依赖文件,所以目标被认为是最新的而不去执行规则所定义的命令。
总结一下,源文件首先会生成中间目标文件,再由中间目标文件生成执行文件。在编译时,编译器只检测程序语法,和函数、变量是否被声明。如果函数未被声明,编译器会给出一个警告,但可以生成Object File。...“伪目标”并不是一个文件,只是一个标签,由于“伪目标”不是文件,所以make无法生成它的依赖关系和决定它是否要执行。我们只有通过显示地指明这个“目标”才能让其生效。...(会非常的多) b —— 也就是basic,只输出简单的调试信息。即输出不需要重编译的目标。 v —— 也就是verbose,在b选项的级别之上。...如果你确实不希望任何隐含规则推导,那么,你就不要只写出“依赖规则”,而不写命令。...foo.h(CC) -c (CFLAGS) (CPPFLAGS) -o @ 这个例子,就是说,文件”.c.o”依赖于文件”foo.h”,而不是我们想要的这样: %.o: %.c foo.h(CC)
前面写了一篇文章《Linux C/C++工程中可生成ELF、动/静态库文件的通用Makefile》,里面的Makefile代码有个不好的地方需要修改。...当编译.cpp文件时,使用的STD_OPT变量仍然是编译.c文件时的参数-std=c99,这个在C++中是不支持的。...1 sed命令的简要说明 由于sed命令可用的参数太多了,这里只列举脚本中用到的几个参数: 1 2 3 sed -i:直接修改文件而不是将处理的结果在屏幕上输出; sed -e:多个操作action按顺序执行.../handle_makefile.sh # (c) 2016 vfhky https://typecodes.com/linux/handlemakefilebysed.html # https://github.com...#echo "" | awk '{fflush()}' fi done 3 脚本执行结果 如上图所示,脚本不断遍历src目录下的Makefile文件,然后进行处理。
输出的可执行文件名) ?...在gcc编译时使用-c参数只生成.o文件,只运行到编译并不链接。此外,-c放在gcc的后面和.c函数的后面都行: ? 但是最后生成可执行文件时候-o必须放在.o文件的后面 ?...4.4、变量追加+= 与Qt中.pro文件中添加属性类似,C知识点。 ? 6、Makefile模式规则 在有多个.c文件需要生成.o文件时,可以通过模式规则将所有的.c文件变为对应的.o文件。...一般的文件名都是要生成的伪文件,而伪目标不代表真正的目标名,在执行make命令时通过指定这个伪目标来执行器所在规则所定义的命令。...伪目标的主要作用是避免Makefile中定义的只执行命令的目标和工作目录下的实际文件出现名字冲突。
总结一下,源文件首先会生成中间目标文件,再由中间目标文件生成执行文件。在编译时,编译器只检测程序语法,和函数、变量是否被声明。如果函数未被声明,编译器会给出一个警告,但可以生成Object File。...下面是的取值: a —— 也就是all,输出所有的调试信息。(会非常的多) b —— 也就是basic,只输出简单的调试信息。即输出不需要重编译的目标。...如果你确实不希望任何隐含规则推导,那么,你就不要只写出“依赖规则”,而不写命令。...(建议使用“.cc”作为C++源文件的后缀,而 不是“.C”) 3、编译Pascal程序的隐含规则。...,如: .c.o: foo.h $(CC) -c $(CFLAGS) $(CPPFLAGS) -o $@ $< 这个例子,就是说,文件".c.o"依赖于文件"foo.h",而不是我们想要的这样
2.1 构成 简单的 Makefile 文件由若干如下格式的规则(rule)组成: target: prerequisites recipe target : 通常是程序生成(输出)的一个或多个文件名...recipe: 中文翻译为菜谱,它是 make 用于生成 target 文件或完成 target 任务而执行一系列 shell 命令。这些命令可以放在同一行里,也可以每个命令占一行。...值得注意的是,recipe 默认以制表符开头,而不是空格。 2.2 运行 make 在当前目录下创建一个 Makefile 文件, 命名为 Makefile 。...可以理解是纯粹的任务,而不生成文件。...隐式规则 某些重新生成目标文件的方式非常常用。例如,使用 C 编译器 cc 从 .c 源文件编译生成 .o 目标文件。
用户可以使用 “-S” 选项来进行查看,该选项只进行编译而不进行汇编,生成汇编代码,生成的后缀文件为 .s 实例: gcc –S hello.i –o hello.s 汇编(生成机器可识别代码...install -y libstdc+±static 3、gcc 选项 -E: 只激活预处理,这个不生成文件,你需要把它重定向到一个输出文件里面 -S: 编译到汇编语言不进行汇编和链接 -c: 编译到目标代码...-o: 文件输出到 文件 -D: 宏的命令行定义,多用于条件编译中的调试 -static: 此选项对生成的文件采用静态链接 -g: 生成debug程序。...make程序会读取makefile文件中的数据,然后根据规则调用编译器,汇编器,链接器产生最后的输出,即 makefile文件保存了编译器和连接器的参数选项。...,我们想一想,一个文件是否需要被重新生成,是不是与其改变的时间有关?
###二、Make的一般使用: 1、Makefile的基本构成: Makefile由规则构成,一条规则生成一个或多个目标文件,其格式如下: 目标文件列表 分隔符 依赖文件列表 [;命令] //[]中的内容可选...文件指示:包括三个部分,一个类似于c语言中的include语句,可以将另一个makefile文件包含进来;二是根据情况指定makefile中的有效部分,就像c语言中的预编译#if一样;三是定义一个多行的命令...@:执行命令时不在屏幕上输出该命令的内容。...-d:输出所有的调试信息。 -e或--environment-overrides:不允许makefile对系统环境变量进行重新赋值。...如果只打印信息而 不执行命令,可使用make -qp ,查看make执行前的隐含规则和预定义变量,使用make -p-f /dev/null。
*.i 的预处理文件,该过程只激活预处理,不生成文件,所以需要重定向一个输出文件 使用指令 -E,如gcc -E main.c -o main.i 或 cpp main.c -o main.i...2.编译(ccl):生成 *.s 文件,该过程只激活预处理和编译, 关联文件可以是*.i 或 *.c 使用指令 -S ,如 gcc -S main.c -o main.s 或 gcc...-S main.i -o main.s 或 ccl -S main.c -o main.s 3.汇编(as):生成 *.o 文件,该指令只激活预处理、编译和汇编, 关联文件可以是 *...-c main.s -o main.o 或 as main.c -o main.o 4.连接(ld):生成可执行文件,相关联文件可以是 *.c 、*.i 、*.s 、*.o之一 gcc...C文件时,这种编译方法就显得力不从心了,这时就要用到makefile了 为了结合上面的gcc指令,我写了如下的makefile文件 1 main:main.o 2 gcc main.o -o main
4.make的工作流程 执行Makefile时,在默认的方式下,我们只输入make命令,则相当于make first_objname_in_Makefile,意思是生成出现在Makefile中第一个目标文件...“:=”表示变量的值决定于它在Makefile中的位置,而不是整个Makefile展开后的最终值。...对于一般多字符变量的引用必须使用括号,否则make将把变量名的首字母作为作为变量而不是整个字符串($PATH在Makefile中实际上是$(P)ATH)。...原来这种是老式的“双后缀规则”,编译器会自动将Makefile所在目录的.cpp识别为源文件后缀,而.o识别为输出文件后缀。特别需要注意的是,后缀规则不允许任何依赖文件,但也不能没有命令。...) -o $@ $< 这个例子,就是说,文件”.c.o”依赖于文件”foo.h”,而不是我们想要的这样: %.o: %.c foo.h $(CC) -c $(CFLAGS) $(CPPFLAGS
1.程序的翻译过程 预处理(头文件展开,去注释,宏替换,条件编译) 编译:把C变成汇编语言 汇编:把汇编变成二进制(不是可执行,二进制目标文件不能被执行) 链接:把你下的代码和C标准库中的代码合起来 2...对于动态库和静态库来说,动态库是系统自带的,即系统安装完毕就可以使用,而静态库则一般需要我们自己安装,这也说明了静态库并不是直接拷贝动态库的内容。...test.c -o test的编译指令,好我们来看看如何操作: 步骤1: 创建makefile文件,并在makefile文件里编辑相应的依赖关系和依赖方法 **步骤2:**执行make指令并输出...对于上面的步骤来说,在makefile文件中:第一行代表着依赖关系,也就是mycode这个要生成的文件是基于mycode.c实现的,mycode依赖于mycode.c。...3.2 Makefile语法 就此例来说,第一行仍是依赖关系,但注意下面必须是tab造成的空格,而不是直接按四下空格。
编译和汇编,不会链接 使用方式举例: 方式1: gcc hello.c 输出一个a.out,然后....gcc -o hello hello.c 输出hello,然后./hello来执行该应用程序。...链接就是将汇编生成的OBJ文件、系统库的OBJ文件、库文件链接起来, 最终生成可以在特定平台运行的可执行程序。...gcc -o test a.c b.c // 简单, // 但是会对所有文件都处理一次, // 文件多时如果只修改其中一个文件会导致效率低 Makefile的核心—规则 : 目标 : 依赖1 依赖...添加CFLAGS c. 分析裸板Makefile
---- Makefile概述 基本格式 基本上每一个 Makefile 主体就是由若干个以下规则模块组成 : 表明输出的目标,输出目标的依赖对象和生成目标需要执行的命令。...但是对于一个文件包含什么头文件,对应修改 Makefile,这样是很难维护的。 C/C++ 编译器 -MM 功能可以自动找寻文件的包含 ,生成依赖关系。...执行: $ gcc -MM mian.c 输出: main.o : main.c defs.h 因此,我们借助编译器帮我们自动生成依赖关系,并包含到 Makefile 中 -include $(DEPS...x = XXX y = $(x) x = YYY 在上例中,y的值将会是 YYY ,而不是 XXX。...:= 是覆盖之前的值(类似C中的 = ) 变量的值决定于它在makefile中的位置,而不是整个makefile展开后的最终值。
Makefile文件文件的内容来执行大量的编译工作,Make将只编译改动的代码文件,而不用完全编译。...o main main.o:main.c gcc -c main.c clean: rm -rf main.o main 在终端运行make –f makefile1的时候,可以看到通过两个步骤将源文件编译生成可执行文件...二、Make程序中有许多选项,其中最常用的3个选项为: 1、-k:作用是在让make命令在发现错误时仍然就执行,而不是在检测到第一个错误时就停止,所以可是使用这个选项在一次操作中发下所有未编译成功的源文件...2、-n:作用是让make命令输出将要执行的操作步骤,而不是真正执行这些操作 3、-f :作用是告诉make将文件名为filename的我文件作为makefile文件。...此main文件并非此工程以及Makefile需要的依赖文件,为在本人在测试阶段手动编译生成的可执行文件main,由于疏忽没有删掉。后续操作中可以忽略此文件。
注:个人学习所记,仅供参考 实验七:Makefile实验 实验原理 在Linux或Unix环境下,对于只含有几个源代码文件的小程序(如hello.c)的编译,可以手工键入gcc命令对源代码文件逐个进行编译...Makefile是按照某种脚本语法编写的文本文件,而GNU make能够对Makefile中指令进行解释并执行编译操作。...Tab而不能使用多个空格)。...如果只希望利用gcc命令来生成test.o目标文件,这时,就可以利用如下的makefile来定义test.o的创建规则: #This makefile just is a example....CPP C程序的预处理器(输出是标准输出设备)。默认命令是“$(CC) –E”。 FC Fortran 和 Ratfor 的编译器和预处理程序。默认命令是“f77”。
一般顺序是先创建.pro文件,然后由.pro文件生成Makefile文件,makefile文件保存了编译器和连接器的参数选项,还表述了所有源文件之间的关系(源代码文件需要的特定的包含文件,可执行文件要求包含的目标文件模...块及库等).创建程序(make程序)首先读取makefile文件,然后再激活编译器,汇编器,资源编译器和连接器以便产生最后的输出,最后输出并生成 的通常是可执行文件.创建程序利用内置的推理规则来激活编译器...,比较清晰还有,最好windows的路径不要有空格,中文也不要有,斜杠也推荐用/ 而不是windows的\ 因为跟分行符号\相同了 /可以在unix和windows用,但是\貌似到了unix或linux...你也可以传递任务到命令行里面, 当这样做的时候,这些任务将会放到生成pro文件之后。 一般先用project模式生成.pro文件,然后再将.pro文件qmake一次生成Makefile。...,将所有的文件编译成一个与平台无关的工程文件) 可见默认生成的文件名为 qt.pro 3、qmake (读取本身的Qt设置,生成与库一致的相应的Makefile) 4、make (根据生成的
领取专属 10元无门槛券
手把手带您无忧上云