编译内核Makefile时 混和的隐含和普通规则。停止
linux makefile编写规则

linux makefile编写规则(原创实用版)目录一、Makefile 简介二、Makefile 的规则1.目标文件2.依赖文件3.命令三、Makefile 中的变量1.通用变量2.局部变量四、Makefile 中的路径1.源文件路径2.目标文件路径3.库文件路径五、Makefile 编写实例六、总结正文一、Makefile 简介Makefile 是一个用于自动化构建和编译软件的脚本文件,通常在Linux 系统中使用。
它可以帮助开发者管理源代码,以及确定哪些文件需要编译,如何编译,以及编译后的文件如何链接。
通过编写 Makefile,开发者可以轻松地构建和维护复杂的软件项目。
Makefile 主要包括三类规则:目标文件、依赖文件和命令。
1.目标文件目标文件是 Makefile 中要生成的文件,可以是对象文件、库文件或执行文件。
在 Makefile 中,目标文件通常以“target”关键字开头,后面跟要生成的文件名。
例如:“target = main.o”。
2.依赖文件依赖文件是 Makefile 中要生成目标文件所需要的其他文件,通常是源代码文件。
在 Makefile 中,依赖文件通常以“prerequisites”关键字开头,后面跟要依赖的文件名。
例如:“prerequisites = a.c b.c”。
3.命令命令是用来生成目标文件的命令,通常是编译器或链接器。
在Makefile 中,命令通常以“command”关键字开头,后面跟要执行的命令。
例如:“command = gcc -o main.o a.c b.c”。
三、Makefile 中的变量Makefile 中的变量可以用于存储常量值,以便在 Makefile 中多次使用。
变量分为通用变量和局部变量。
1.通用变量通用变量是在整个 Makefile 中都可以使用的变量。
通用变量通常在Makefile 的开头定义,使用“define”关键字。
c语言makefile编写规则(一)

c语言makefile编写规则(一)C语言Makefile编写规则1. Makefile介绍Makefile是一种文件,其中包含了一组规则(rules)用于编译和构建项目。
它的作用是告诉系统如何编译代码,生成可执行文件。
2. Makefile规则基本结构Makefile规则由以下几部分组成:目标(Target)目标是一个文件,可以是源代码文件、中间文件或最终生成的可执行文件。
依赖(Dependencies)依赖指的是生成目标所需要的文件或其他目标。
当某个依赖文件发生变化时,目标就需要重新生成。
命令(Commands)命令是指执行编译、链接等操作的具体命令。
当目标需要重新生成时,Makefile会执行相应的命令。
规则示例以下是一个简单的示例,展示了一个C语言源文件的编译过程:target: dependenciescommand其中, - target表示目标文件; - dependencies表示生成目标所需要的文件或其他目标; - command表示具体的编译命令。
例如,假设有一个名为`的C语言源文件,我们想要生成一个名为hello`的可执行文件。
那么对应的Makefile规则可以定义如下:hello:gcc -o hello3. Makefile变量Makefile中还可以定义变量,以提高代码的可读性和重用性。
变量可以存储命令、文件名、路径等信息。
变量定义变量的定义采用变量名 = 值的方式进行,例如:CC = gcc其中,CC是变量名,gcc是变量的值。
变量引用使用变量时,需要在变量名前加$符号进行引用。
例如,使用上述定义的CC变量可以这样写:$(CC) -o hello4. Makefile示例以下是一个完整的Makefile示例,展示了多个目标之间的依赖关系和命令定义:CC = gccall: hellohello:$(CC) -o hello:$(CC) -cclean:rm -f hello在上述示例中,共定义了3个目标:all、hello和。
makefile文件的显示规则

makefile文件的显示规则Makefile文件是用于构建和管理软件项目的工具,它定义了一系列规则,用来指导如何编译、链接和安装软件。
在本文中,我们将详细介绍Makefile文件中的显示规则。
一、目标规则(T arget Rule)目标规则是Makefile中最常见的一种规则,它用来指定如何生成一个目标文件。
一个目标规则由目标、依赖和命令组成。
目标是我们要生成的文件,依赖是生成目标文件所需要的其他文件,而命令则是生成目标文件的具体步骤。
例如,我们可以定义一个目标规则来生成一个名为"hello"的可执行文件:```hello: main.o func.ogcc -o hello main.o func.o```在这个例子中,"hello"是目标文件,"main.o"和"func.o"是依赖文件,而命令"gcc -o hello main.o func.o"则是生成目标文件的具体步骤。
二、伪目标规则(Phony T arget Rule)伪目标规则用来指定一些特殊的目标,它们并不是真正的文件,而是一些需要执行的命令。
伪目标规则的目标名前面通常会加上一个"phony"修饰符,以便与真正的文件区分开来。
例如,我们可以定义一个伪目标规则来清理编译生成的文件:```.PHONY: cleanclean:rm -f hello *.o```在这个例子中,".PHONY"表示这是一个伪目标规则,"clean"是目标名,而命令"rm -f hello *.o"则是清理编译生成的文件的具体步骤。
三、模式规则(Pattern Rule)模式规则是一种更加抽象的规则,它可以匹配多个目标文件。
模式规则使用通配符来表示目标和依赖中的文件名模式,并使用"%"来表示匹配的部分。
makefile的模式规则

Makefile中的模式规则是一种特殊的规则,它允许你使用模式来匹配目标文件,然后根据匹配结果执行相应的命令。
模式规则中的目标文件名包含一个模式字符“%”,该字符可以匹配任何非空字符串。
在模式规则中,目标文件是一个带有模式字符“%”的文件,使用模式来匹配目标文件。
一旦依赖目标中的“%”模式被确定,make 会被要求去匹配当前目录下所有的文件名,一旦找到,make就会执行规则下的命令。
在模式规则中,目标可能会是多个的,如果有模式匹配出多个目标,make就会产生所有的模式目标。
此时,make关心的是依赖的文件名和生成目标的命令这两件事。
以下是一个简单的Makefile模式规则示例:
```makefile
%.o : %.c
$(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o $@
```
这个规则表示将所有的.c文件编译成.o文件。
其中,“$<”表示了所有依赖目标的挨个值,“$@”表示了所有目标的挨个值。
这些自动化变量将在后面的章节中详细讲述。
总的来说,Makefile的模式规则是一种强大的工具,它可以根据文件名模式自动构建目标文件,并执行相应的命令。
makefile编译流程

makefile编译流程Makefile是一种用于自动化编译的工具,它可以根据源代码文件的依赖关系自动编译出目标文件。
Makefile的编写需要遵循一定的规则和语法,下面将介绍Makefile的编译流程。
1. 编写Makefile文件Makefile文件是一个文本文件,其中包含了编译的规则和依赖关系。
在编写Makefile文件时,需要遵循一定的语法规则,如使用TAB键缩进、使用变量和函数等。
2. 执行make命令在Makefile文件所在的目录下执行make命令,make会自动读取Makefile文件,并根据其中的规则和依赖关系进行编译。
如果Makefile文件中没有指定目标,则默认编译第一个目标。
3. 分析依赖关系在执行make命令时,make会先分析Makefile文件中的依赖关系,确定哪些文件需要重新编译。
如果某个源文件被修改了,那么与之相关的目标文件也需要重新编译。
4. 编译源文件在确定需要重新编译的文件后,make会依次编译每个源文件,生成对应的目标文件。
编译过程中,make会根据Makefile文件中的规则和命令进行编译。
5. 链接目标文件在所有的源文件都编译完成后,make会将所有的目标文件链接起来,生成最终的可执行文件。
链接过程中,make会根据Makefile文件中的规则和命令进行链接。
6. 完成编译当所有的源文件都编译完成并链接成功后,make会输出编译成功的信息,并生成最终的可执行文件。
如果编译过程中出现错误,make会输出错误信息并停止编译。
总之,Makefile编译流程是一个自动化的过程,它可以大大提高编译的效率和准确性。
在编写Makefile文件时,需要注意语法规则和依赖关系,以确保编译过程的正确性。
makefile文件语法规则

makefile文件语法规则Makefile文件的基本语法规则包括以下几点:1. 注释:以井号(#)开头的行被视为注释,不会被执行。
2. 规则:每条规则由一个目标文件和一组依赖文件组成,以及一个用于构建目标文件的命令。
规则的格式如下:Css:目标文件:依赖文件命令目标文件和依赖文件之间用冒号(:)分隔,命令部分指定了如何从依赖文件生成目标文件。
3. 变量:Makefile中可以使用变量来存储值,变量的值可以包含文本、空格、数字等。
变量名以美元符号($)开头,例如:Makefile:VAR = value命令= $VAR4. 函数:Makefile支持使用函数来执行更复杂的操作。
函数的语法如下:Scss:函数名(参数)Makefile中内置了一些常用的函数,如字符串操作函数、条件判断函数等。
也可以自定义函数。
5. 通配符:Makefile中可以使用通配符来匹配多个文件,常见的通配符有“*”和“?”。
例如,“*.c”表示匹配所有以“.c”结尾的文件,“a?b”表示匹配“ab”、“axb”、“ayb”等字符串。
6. 回声:在Makefile中,命令前面加上“@”符号可以关闭回声,即不会在执行命令时显示该命令。
例如:Makefile:@echo Hello, world!这条命令执行时不会输出“Hello, world!”的文本。
7. 模式规则:Makefile中的模式规则允许根据一组通配符匹配的文件来定义规则,格式如下:Makefile:模式:目标文件命令1命令2模式匹配的文件将按照指定的命令构建目标文件。
c语言makefile编写规则

c语言makefile编写规则C语言Makefile编写规则什么是MakefileMakefile是一种用于管理和构建软件项目的文件,通常被用于编译和链接C语言程序。
Makefile中包含了一系列的规则和指令,用于告诉编译器如何编译程序中的各个部分,并最终生成可执行文件。
Makefile的基本结构Makefile的基本结构由多个规则组成,每个规则由一个目标(target)和一个或多个依赖(dependencies)组成。
目标指明了要生成的文件或要执行的操作,依赖指明了目标所依赖的文件或操作。
一个简单的Makefile规则的语法如下:target: dependenciescommand其中,target是生成的文件或要执行的操作,dependencies是目标所依赖的文件或操作,command是执行的命令。
每个规则的命令必须以一个tab键开始。
Makefile的应用场景Makefile广泛应用于C语言项目的构建中,它可以自动化执行编译、链接和清理等操作。
通过Makefile,我们可以方便地管理源代码文件、头文件和库文件之间的关系,从而提高项目的可维护性和可扩展性。
Makefile的编写规则1.目标和依赖应该使用合适的命名方式,能够清晰地表达其作用以及所依赖的内容。
避免使用中文、空格和特殊字符,使用下划线和英文字母进行命名。
2.命令行命令应该以tab键开始,而不是空格。
这是Makefile的语法要求,且使用tab键可以提高代码的可读性。
3.注意规则的顺序,确保前置依赖在目标之前。
Makefile会按照规则的声明顺序进行构建,如果前置依赖在目标之后,可能导致构建失败。
4.使用变量来定义重复使用的内容,如编译器选项、源文件列表等。
这样可以提高代码的可维护性,并方便进行后续的修改和维护。
5.使用通配符来表示一类文件,如使用*.c表示所有的C语言源文件,使用$(wildcard pattern)函数来获取符合某种模式的文件列表。
makefile规则

makefile规则makefile规则是指用于描述当make执行Makefile文件时,make 应该采取的动作。
makefile文件由一系列规则组成,并且每条规则都有由一个目标、零个或多个依赖条件和一系列可以对目标文件进行生成、删除和修改的指令构成。
1、静态模式规则:静态模式规则指明了在make执行规则的过程中,make会将特定的依赖关系用静态的模式规则处理。
通常使用固定长度的字符串来定义静态规则,并且字符串中可以包括多个模式,如“%.c”和“%.o”。
2、伪目标规则:伪目标规则可以用来定义一组目标,这些目标只有在其他目标依赖它们时才有可能被make执行。
例如,“clean”是一个伪目标,可以用来定义一组清理工作。
3、自动变量:自动变量是make文件规则中的特殊变量,可以使make更加聪明、更加灵活。
自动变量可以为make命令提供一些临时的信息,使make可以判断出依赖列表中目标的文件是什么,同时也可以为所有的目标提供一种标准的输出路径。
4、变量引用:变量引用是make中的一种重要特性,主要指的是在规则中可以使用一个或多个变量来引用其他变量。
变量引用可以让make在定义变量后不用继续修改makefile文件就能对变量进行操作。
5、函数式语法:函数式语法是make中的一种特殊语法,允许make在一个单独的语句中使用多行表达式。
函数式语法可以用来定义变量,从而减少代码冗余,提高makefile文件的可读性。
6、条件分支语句:条件分支语句是makefile文件中的一种语法,它使得make可以根据某些条件来执行特定的动作。
当make执行makefile文件时,如果if 条件判断成立,则会继续执行if中的语句;如果if条件不成立,则执行else中的语句。
7、包含语句:包含语句是makefile文件中的一种重要语法,它允许make从另一个makefile文件中读取规则并执行它们。
通过此种方式,用户可以将makefile文件划分成多个文件,例如一个文件定义编译目标,另一个文件定义安装规则等,从而使makefile文件更加简洁。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
编译时makefile:Makefile:1503: *** 混和的隐含和普通规则。
停止。
处理
(2012-05-05 16:45:32)
转载▼
1.makefile
#AR=ar
#ARCH=arm
#CC=arm-linux-gcc
obj-m := hello.o
#if we need more than one source code to build the module
#we should use the variable below: example: modules-objs := file1.o file2.o
#KDIR := /lib/modules/$(shell uname -r)/build
KDIR := /UP-Magic/kernel/linux-2.6.24.4
PWD := $(shell pwd)
default:
# $(MAKE) -C $(KDIR) M=$(PWD) modules
$(MAKE) -C $(KDIR) M=$(PWD) modules
clean:
rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions *.order *.symvers make时出现;
[root@hpx driverPractise]# make
make -C /UP-Magic/kernel/linux-2.6.24.4 M=/bochuang/driverPractise modules make[1]: 进入目录“/UP-Magic/kernel/linux-2.6.24.4”
Makefile:1503: *** 混和的隐含和普通规则。
停止。
make[1]: 离开目录“/UP-Magic/kernel/linux-2.6.24.4”
make: *** [default] 错误 2
搜索一下,有人解决了,转载过来:
在编译 kernel 时,有机会碰见下面的错误:
Makefile: *** 混合的隐含和普通规则。
停止。
Makefile: *** mixed implicit and normal rules. Stop.
这个原因可能是Make工具对低版本内核的Makefile一些旧的规则兼容不好,我们只需要修改对应的Makefile。
如一:
原始的:
大概在1503行 / %/: prepare scripts FORCE
$(Q)$(MAKE) KBUILD_MODULES=$(if $(CONFIG_MODULES),1)
$(build)=$(build-dir)
修改后:
/: prepare scripts FORCE
$(Q)$(MAKE) KBUILD_MODULES=$(if $(CONFIG_MODULES),1)
$(build)=$(build-dir)
%/: prepare scripts FORCE
$(Q)$(MAKE) KBUILD_MODULES=$(if $(CONFIG_MODULES),1)
$(build)=$(build-dir)
如二:
原始的:
大概在 435行: config %config: scripts_basic outputmakefile FORCE $(Q)mkdir -p include/linux include/config
$(Q)$(MAKE) $(build)=scripts/kconfig $@
修改后:
config: scripts_basic outputmakefile FORCE
$(Q)mkdir -p include/linux include/config
$(Q)$(MAKE) $(build)=scripts/kconfig $@
%config: scripts_basic outputmakefile FORCE
$(Q)mkdir -p include/linux include/config
$(Q)$(MAKE) $(build)=scripts/kconfig $@
解决。