首页
学习
活动
专区
圈层
工具
发布

换个角度说Makefile

我们发现会报错,因为你要依赖的文件找不到,而且也没有其他规则能够生成它。...CFLAGS=-g -Wall 设置链接库 我们这里只用到了libm.so库 LIBS=-lm 编译 我们的目标文件是main.o依赖main.c,该规则应该是这样的: OBJ=main.o $(OBJ...TARGET=main $(target):main.o $(CC) $(CFLAGS) -o $(TARGET) $(OBJ) $(LIBS) 而为了使用make clean,即通常用于清除这些中间文件...这里的目标文件main依赖的是main.o,它开始会去找main.o,发现这个文件也没有,就会看是不是有规则会生成main.o,欸,你还别说,真有。...构建C/C++项目的makefile做了什么 makefile主要做下面的事情(以C程序为例) 用变量保存各种设置项,例如编译选项,编译器,宏,包含的头文件等 把.c编译成.o 把.o与库进行链接 清除生成的文件

96820
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Makefile 的使用(在 Linux 中使用 make 命令来编译程序)

    这时我们需要把“clean”这个目标,设置为“假想目标”,这样可以确保执行“make clean”时那些删除命令肯定可以得到执行。...在 Makefile.build 中设置编译规则,有 3 条编译规则: i. 怎么编译子目录?...(target)通常是要生成的文件的名称,可以是可执行文件或 OBJ 文件,也可以是一个执行的动作名称,诸如clean。...开始时这两个文件还没有生成,在执行生成 test 的命令之前先将 main.o、sub.o 作为目标查找到合适的规则,以生成 main.o、sub.o。...④ 第 7、8 行就是用来生成 main.o、sub.o 的规则: 对于 main.o 这个规则就是: main.o:main.c gcc -c -o main.o main.c 对于 sub.o 这个规则就是

    10K10

    6_Makefile与GCC

    再次使用make编译器会返回,可执行程序为最新的结果,我们依旧修改一下add.c,然后在编译,如下: $ make gcc -c add.c gcc -o output main.o add.o sub.o...02 OBJ += sub.o ​ 这样的结果是OBJ的值为:”main.o,add.o,sub.o“。...​ 2)$规则中的第一个依赖文件 ​ 3)$^:规则中的所有依赖文件 ​ 我们上面的例子继续完善,修改为采用自动变量的格式,如下: 01 CC = gcc 02 OBJ = main.o add.o...6.5.4 模式规则 ​ 模式规则实在目标及依赖中使用%来匹配对应的文件,我们依旧使用上面的例子,采用模式规则格式,如下: 01 CC = gcc 02 OBJ = main.o add.o sub.o.../src/100.o ​ 其中,这条规则表示:把变量中所有后缀为.c的文件替换为.o。 命令执行完,OBJ变量的值:./src/ask.o .

    4.1K10

    手把手教你写一个 Makefile 文件

    -o main main.o openFile.o readFile.o writeFile.o # 生成main的规则 main.o:main.c # mian.o文件生成所需要的mian.c...编写完成后,执行make命令,make会在当前目录下找到名字为Makefile或makefile的文件,程序就会自动运行,产生相应的中间文件和可执行文件 a....如果执行make出现如下信息,那就是你的代码没有修改过,Makefile拒绝你的请求: 这里还会有一种情况就是如果只修改过其中一个文件,那么重新编译就可以看到只编译修改的那个文件,没有编译其他未修改的文件...,省略版和基础版的结果是一样的,省略版的makefile中去掉了生成main.o、openFile.o、readFile.o和writeFile.o这些目标的依赖和生成命令,这就是make的隐含规则,make...执行make后的结果: make执行后bin目录里面已经生成了可执行文件main,obj目录里面已经生成了中间目标文件 main.o、openFile.o、readFile.o、writeFile.o

    2.3K10

    Linux中Makefile文件详解

    Makefile 解释 CC: 编译器的变量,这里使用 gcc。 CFLAGS: 编译选项的变量,这里设置了 -Wall(显示所有警告)和 -g(生成调试信息)。...all: 默认目标,执行 make 命令时将会构建该目标。 $(TARGET): 目标文件的生成规则,告诉 Make 如何生成最终的可执行文件。...$(OBJS): 中间文件的生成规则,告诉 Make 如何生成中间目标文件。 %.o: %.c: 通用规则,告诉 Make 如何将 .c 文件编译成对应的 .o 文件。...clean: 清理规则,执行 make clean 时将删除生成的可执行文件和中间目标文件。 3. 使用 Makefile 在项目目录中,执行以下命令: 构建项目: make 或 make all。...默认规则 第一个规则通常是默认规则,即在执行 make 命令时默认执行的规则。在上述例子中,默认规则是 all: target1 target2。 15.

    2.2K10

    Linux Make(Makefile)由浅入深的学习与示例剖析

    如果您写的程序没有用到make工具,则说明您写的程序仅仅是个人练习小程序,称不上有实用价值的程序,因此我们必须学习、掌握并灵活运用它。...通常是程序中间体或最后所需要生成的文件名,如 *.o或obj可执行文件的名称。此外,target目标也可以是make执行动作的名称,如clean等 dependency-file:规则的依赖。...一个目标可以没有依赖而只有动作,即只有命令,如clean。此目标只有命令,没有依赖,主要作用是用来删除make过程中产生的中间文件(*.o),做收尾清理工作。...sub_float.o make: $(OBJ) $(CC) -o main $(OBJ) main.o: add.h sub.h add_int.o: add.h add_float.o...makefile的缺省规则如下: ..c.o: gcc -c $< 这个规则表示,所有的 *.o 目标文件都是依赖于相应的 *.c 源文件的, 例如 main.o 依赖于 main.c 。

    2.2K20

    图解嵌入式系统开发之Makefile篇

    使用“更高级”Makefile编译 TARGET := app $(TARGET): main.o cmd.o gcc -o $@ $^ main.o: main.c cmd.o: cmd.c...因为该依赖关系中只是 列出来了.c的依赖,没有描述对头文件的依赖,任何一个头文件的更改都需要重新编译所有文件。...头文件,假设该宏一开始没有定义,其生成的cmd.d依赖文件如下。...主Makefile: 主Makefile一般在源码的根目录下, 是执行Make命令读取的第一个Makefile文件,该文件中定义了最终产物的名字,源文件的子目录,启动递归编译,合成最终产物规则,clean...如下: obj-y := main.o obj-y += cmd/ Makefile.build递归到该目录的时候首先包含了该目录下的Makefile文件,然后读取obj-y的值,读到obj-y中 main.o

    1.5K40

    CC++之makefile写法

    make会比较targets文件和prerequisites文件的修改日期,如果prerequisites文件的日期要比targets文件的日期要新,或者target不存在的话,那么,make就会执行后续定义的命令...如果目标文件所依赖的.o文件也存在,那么make会在当前文件中找目标为.o文件的依赖性,如果找到则再根据那一个规则生成.o文件。...而且如果我们修改的是calc.h文件,make就无法察觉到变化了(所以有必要为头文件专门设置一个常量,并将其加入到依赖关系表中)。下面,我们来想一想如何解决这个问题。...,我们已经有了一个不错的makefile,至少用来维护这个小型工程是没有什么问题了。...例如,如果我们想增加自动清理编译结果的功能就可以为其定义一个带伪目标的规则; cc = gcc prom = calc deps = calc.h obj = main.o getch.o getop.o

    1.2K20

    【把Linux“聊”明白】自动化构建-makeMakefile详解

    .PHONY ** 但是一般我们这种clean的目标问文件,我们将它设置为伪目标,用.PHONY修饰,伪目标的特性是总是被执行的**。...如果找到,它会找文件中的第一个目标文件(target),在上面的例子中,它会找到 mypro 这个文件,并把这个文件作为最终的目标文件。...如果 mypro 所依赖的 mypro.o 文件不存在,那么 make 会在当前文件中找目标为 mypro.o 文件的依赖性,如果找到则再根据那个规则生成 mypro.o 文件。...gcc SRC=$(wildcard *.c) OBJ=$(SRC:.c=.o) BIN:最终生成的可执行文件名 CC:指定编译器为 gcc SRC:自动收集当前目录下所有 .c 文件 OBJ:把 .c...(这里是 proc.exe) $^:代表所有依赖文件(这里是 main.o util.o) 模式规则 %.o:%.c @$(CC) $(FLAGS) $< 这是 模式匹配规则: % 代表任意匹配部分(

    42910

    Linux常见工具使用

    OBJ = main.o add.o BIN = myapp 作用:定义最终生成的目标文件名(最后的可执行文件) 默认目标部分 (BIN):(OBJ) 作用:表示目标(BIN) 依赖于(OBJ)中的main.o...过程推导 目标文件.o和依赖关系 main.o依赖于main.cpp add.o依赖于add.cpp 在Makefile中,$OBJ 是要生成的目标文件,它的生成依赖于.cpp文件 规则推导过程 make...return a * b; // 修改了加法为乘法 } 现在,make会根据文件时间戳决定是否重新编译: main.o时间戳未变化,main.cpp不重新编译 add.o文件的时间戳比add.cpp新...无更新时跳过编译:如果目标文件和依赖文件的时间戳都没有变化,make 会跳过编译过程,避免重复工作。...伪目标 伪目标:没有对应文件的目标文件,用来执行命令而不关心文件的存在 伪目标不会检查时间戳,每次执行都会运行相关指令 .PHONY: clean clean: rm -f $(OBJ) $(

    11810

    跟我一起写Makefile

    我们的规则是: 1)如果这个工程没有编译过,那么我们的所有c文件都要编译并被链接。 2)如果这个工程的某几个c文件被修改,那么我们只编译被修改的c文件,并链接目标程序。...makefile的规则 在讲述这个makefile之前,还是让我们先来粗略地看一看makefile的规则。 target ... : prerequisites ......如果edit所依赖的.o文件也不存在,那么make会在当前文件中找目标为.o文件的依赖性,如果找到则再根据那一个规则生成.o文件。...比如,我们声明任意一变量名,叫objects, OBJECTS, objs, OBJS, obj, 或OBJ,只要能够表示obj文件即可。...推导隐晦规则,并分析所有规则。 为所有的目标文件创建依赖关系链。 根据依赖关系,决定哪些目标要重新生成。 执行生成命令。 1-5步为第一个阶段,6-7为第二个阶段。

    1.2K70

    makefile 基础、进阶及常用 makefile

    先来分析一下,我们把手动执行编译的过程逆向思考一下,想生成目标为可执行的 app 文件,需要依赖 4 个 .o 文件的支持,main.o add.o sub.o mul.o。...执行 make 命令后,可以达到同样的效果。 makefile 模式规则 再分析一下上面的 makefile 代码,对于每个要生成的 .o 文件,我们都要给他写一条规则,如果有很多怎么办?...其执行流程是要生成的最终目标为 app,app 需要 4 个 .o 文件的支持,这 4 个文件我们用了一个变量 obj 来表示。...当去找 main.o 文件时,发现没有,则去下面找是否有匹配生成这个 .o 文件的规则,因为 %.o 可以匹配 main.o,所以找到了下面这条规则: %.o:%.c gcc -c $< -o...$@ 规则中的 %.c 的 % 值,取决于目标 %.o,而此时 %.o 中 % 的值是上面生成 app 所需的 main.o,所以解释以后的代码相当于下面这样: main.o:main.c gcc

    91810

    跟我一起写Makefile:MakeFile介绍

    我们的规则是: 1)如果这个工程没有编译过,那么我们的所有c文件都要编译并被链接。 2)如果这个工程的某几个c文件被修改,那么我们只编译被修改的c文件,并链接目标程序。...makefile的规则 在讲述这个makefile之前,还是让我们先来粗略地看一看makefile的规则。 target ... : prerequisites ......如果edit所依赖的.o文件也不存在,那么make会在当前文件中找目标为.o文件的依赖性,如果找到则再根据那一个规则生成.o文件。...比如,我们声明任意一变量名,叫objects, OBJECTS, objs, OBJS, obj, 或OBJ,只要能够表示obj文件即可。...推导隐晦规则,并分析所有规则。 为所有的目标文件创建依赖关系链。 根据依赖关系,决定哪些目标要重新生成。 执行生成命令。 1-5步为第一个阶段,6-7为第二个阶段。

    1.2K20
    领券