百度
360搜索
搜狗搜索

makefile语法,makefile怎么用?详细介绍

本文目录一览: 请教makefile语法问题

makefile
英[me?k'fa?l] 美[me?k'fa?l]
[计] 文件编写,文卷编写;
[例句]Now I have a Makefile. PL, and one other file in the project.
现在我们已经在项目中拥有了Makefile.PL和另一个文件。

Makefile.build中“$(real-objs-m) : quiet_modtag := [M]”请问这是什么语法?

这是目标指定变量语法
设置一个目标指定变量的语法为:
TARGET ... : VARIABLE-ASSIGNMENT
或者:
TARGET ... : override VARIABLE-ASSIGNMENT

1.“ VARIABLE-ASSIGNMENT”可以使用任何一个有效的赋值方式,“ =”(递
归)、“ :=”(静态)、“ +=”(追加)或者“? =”(条件)。
2.目标的变量变量会作用到由这个目标所引发的所有的规则中去。例如:
prog : CFLAGS = -g
prog : prog.o foo.o bar.o
这个例子中,无论 Makefile 中的全局变量“ CFLAGS”的定义是什么。对于目
标“ prog”以及其所引发的所有(包含目标为“ prog.o”、“ foo.o”和“ bar.o”的所有
规则)规则,变量“ CFLAGS”值都是“ -g”。
使用目标指定变量可以实现对于不同的目标文件使用不同的编译参数。看一个例
子:
# sample Makefile
CUR_DIR = $(shell pwd)
INCS := $(CUR_DIR)/include
CFLAGS := -Wall –I$(INCS)
EXEF := foo bar
.PHONY : all clean
all : $(EXEF)
foo : foo.c
foo : CFLAGS+=-O2
bar : bar.c
bar : CFLAGS+=-g
………..
………..
$(EXEF) : debug.h
$(CC) $(CFLAGS) $(addsuffix .c,$@) –o $@
clean :
$(RM) *.o *.d $(EXES)
这个 Makefile 文件实现了在编译程序“ foo”使用优化选项“ -O2”但不使用调试选项
“ -g”,而在编译“ bar”时采用了“ -g”但没有“ -O2”。这就是目标指定变量的灵活之
处。
针对特定目标的规则

makefile怎么用?

是要先./configure一下,再make,再make install。
源码安装的方法是:
step1 ./configure
step2 make
step3 make install
如果仔细看,会发现,解压之后的软件源码包的目录下没有Makefile,然后在执行了./configure
会生成了很多奇怪名字的文件(./configure命令就是执行软件源码根目录下的名为configure的脚本),就包括了Makefile文件,在./configure的时候,Makefile.in是入口。
扩展资料:
Make工具最主要也是最基本的功能就是通过makefile文件来描述源程序之间的相互关系并自动维护编译工作。
而makefile 文件需要按照某种语法进行编写,文件中需要说明如何编译各个源文件并连接生成可执行文件,并要求定义源文件之间的依赖关系。
makefile 文件是许多编译器--包括 Windows NT 下的编译器--维护编译信息的常用方法,只是在集成开发环境中,用户通过友好的界面修改 makefile 文件而已。
在 UNIX 系统中,习惯使用 Makefile 作为 makefile 文件。如果要使用其他文件作为 makefile,则可利用类似下面的 make 命令选项指定 makefile 文件:
参考资料来源:百度百科-Makefile

make makefile cmake qmake都是什么,有什么区别

1. make 是用来执行Makefile的。
2. Makefile是类unix环境下(比如Linux)的类似于批处理的"脚本"文件。其基本语法是: 目标+依赖+命令,只有在目标文件不存在,或目标比依赖的文件更旧,命令才会被执行。由此可见,Makefile和make可适用于任意工作,不限于编程。比如,可以用来管理latex。
3. Makefile+make可理解为类unix环境下的项目管理工具,但它太基础了,抽象程度不高,而且在windows下不太友好(针对visual studio用户),于是就有了跨平台项目管理工具cmake
4. cmake是跨平台项目管理工具,它用更抽象的语法来组织项目。虽然,仍然是目标,依赖之类的,但更为抽象和友好,比如可用math表示数学库,而不需要再具体指定到底是math.dll还是libmath.so,在windows下它会支持生成visual studio的工程,在linux下它会生成Makefile,甚至它还能生成eclipse工程文件。也就是说,从同一个抽象规则出发,它为各个编译器定制工程文件。
5. cmake是抽象层次更高的项目管理工具,cmake命令执行的CMakeLists.txt文件
6. qmake是Qt专用的项目管理工具,对应的工程文件是*.pro,在Linux下面它也会生成Makefile,当然,在命令行下才会需要手动执行qmake,完全可以在qtcreator这个专用的IDE下面打开*.pro文件,使用qmake命令的繁琐细节不用管了。
总结一下,make用来执行Makefile,cmake用来执行CMakeLists.txt,qmake用来处理*.pro工程文件。Makefile的抽象层次最低,cmake和qmake在Linux等环境下最后还是会生成一个Makefile。cmake和qmake支持跨平台,cmake的做法是生成指定编译器的工程文件,而qmake完全自成体系。

makefile中ifeq,ifneq,ifdef和ifndef的区别与用法

makefile中ifeq,ifneq,ifdef和ifndef的区别与用法
使用条件判断,可以让make根据运行时的不同情况选择不同的执行分支。条件表达式可以是比较变量的值,或是比较变量和常量的值。
一、示例
下面的例子,判断$(CC)变量是否“gcc”,如果是的话,则使用GNU函数编译目标。
libs_for_gcc = -lgnu
normal_libs =
foo: $(objects)
ifeq ($(CC),gcc)
$(CC) -o foo $(objects) $(libs_for_gcc)
else
$(CC) -o foo $(objects) $(normal_libs)
endif
可见,在上面示例的这个规则中,目标“foo”可以根据变量“$(CC)”值来选取不同的函数库来编译程序。
我们可以从上面的示例中看到三个关键字:ifeq、else和endif。ifeq的意思表示条件语句的开始,并指定一个条件表达式,表达式包含两个参数,以逗号分隔,表达式以圆括号括起。else表示条件表达式为假的情况。endif表示一个条件语句的结束,任何一个条件表达式都应该以endif结束。
当我们的变量$(CC)值是“gcc”时,目标foo的规则是:
foo: $(objects)
$(CC) -o foo $(objects) $(libs_for_gcc)
而当我们的变量$(CC)值不是“gcc”时(比如“cc”),目标foo的规则是:
foo: $(objects)
$(CC) -o foo $(objects) $(normal_libs)
当然,我们还可以把上面的那个例子写得更简洁一些:
libs_for_gcc = -lgnu
normal_libs =
ifeq ($(CC),gcc)
libs=$(libs_for_gcc)
else
libs=$(normal_libs)
endif
foo: $(objects)
$(CC) -o foo $(objects) $(libs)
二、语法
条件表达式的语法为:

;

;

endif

以及:

;

;

else

;

endif

其中

;表示条件关键字,如“ifeq”。这个关键字有四个。

第一个是我们前面所见过的“ifeq”

ifeq (

;,

😉

ifeq '

;' '

;'

ifeq "

阅读更多 >>>  makefile文件编写,编写一个简单的 makefile 文件

;" "

;"

ifeq "

;" '

;'

ifeq '

;' "

;"

比较参数“arg1”和“arg2”的值是否相同。当然,参数中我们还可以使用make的函数。如:

ifeq ($(strip $(foo)),)

;

endif

这个示例中使用了“strip”函数,如果这个函数的返回值是空(Empty),那么

;就生效。

第二个条件关键字是“ifneq”。语法是:

ifneq (

;,

😉

ifneq '

;' '

;'

ifneq "

;" "

;"

ifneq "

;" '

;'

ifneq '

;' "

;"

其比较参数“arg1”和“arg2”的值是否相同,如果不同,则为真。和“ifeq”类似。

第三个条件关键字是“ifdef”。语法是:

ifdef

;

如果变量

;的值非空,那到表达式为真。否则,表达式为假。当然,

;同样可以是一个函数的返回值。注意,ifdef只是测试一个变量是否有值,其并不会把变量扩展到当前位置。还是来看两个例子:

示例一:

bar =

foo = $(bar)

ifdef foo

frobozz = yes

else

frobozz = no

endif

示例二:

foo =

ifdef foo

frobozz = yes

else

frobozz = no

endif

第一个例子中,“$(frobozz)”值是“yes”,第二个则是“no”。

第四个条件关键字是“ifndef”。其语法是:

ifndef

;

这个我就不多说了,和“ifdef”是相反的意思。

;这一行上,多余的空格是被允许的,但是不能以[Tab]键做为开始(不然就被认为是命令)。而注释符“#”同样也是安全的。“else”和“endif”也一样,只要不是以[Tab]键开始就行了。

特别注意的是,make是在读取Makefile时就计算条件表达式的值,并根据条件表达式的值来选择语句,所以,你最好不要把自动化变量(如“$@”等)放入条件表达式中,因为自动化变量是在运行时才有的。

而且,为了避免混乱,make不允许把整个条件语句分成两部分放在不同的文件中。

1,Makefile中的ifeq:ifeq($(ABC), XXX) CFLAGS += -DABC endif 注意: 逗号和xxx之间必须有一个空格 更需要注意的是: ifeq中的XXX后面不能带空格,如果XXX后面带了一个空格,那空格和XXX会被认为是一个整体 export ABC = XXX[ ][ ] 这里用【】表示一个空格 那么 ifeq($(ABC), XXX ...

2,Makefile中四种变量赋值的区别:Ask: What is the difference between : VARIABLE = value VARIABLE ?= value VARIABLE := value VARIABLE += value I have read the section in GNU Make's manual, but it still doesn't ...

3,,Makefile 中:= ?= += =的区别:在Makefile中我们经常看到 = := ?= +=这几个赋值运算符,那么他们有什么区别呢?我们来做个简单的实验 新建一个Makefile,内容为:ifdef DEFINE_VRE VRE = “Hello Wo ...

,4,zz makefile中=和:=的区别:在Makefile中我们经常看到 = := ?= +=这几个赋值运算符,那么他们有什么区别呢?我们来做个简单的实验 新建一个Makefile,内容为:ifdef DEFINE_VRE VRE = “Hello W ...

,5,嵌入式 Makefile中:=与=与+=与=的区别$@,$^,$
<区别:在makefile中我们经常看到 = :="?=" +="这几个赋值运算符,那么他们有什么区别呢?我们来做个简单的实验" 新建一个makefile,内容为: ifdef define_vre vre else endif ifeq ($(opt),define) ?="Hello 。
makefile中ifeq,ifneq,ifdef和ifndef的区别与用法
使用条件判断,可以让make根据运行时的不同情况选择不同的执行分支。条件表达式可以是比较变量的值,或是比较变量和常量的值。
一、示例
下面的例子,判断$(CC)变量是否“gcc”,如果是的话,则使用GNU函数编译目标。
libs_for_gcc = -lgnu
normal_libs =
foo: $(objects)
ifeq ($(CC),gcc)
$(CC) -o foo $(objects) $(libs_for_gcc)
else
$(CC) -o foo $(objects) $(normal_libs)
endif
可见,在上面示例的这个规则中,目标“foo”可以根据变量“$(CC)”值来选取不同的函数库来编译程序。
我们可以从上面的示例中看到三个关键字:ifeq、else和endif。ifeq的意思表示条件语句的开始,并指定一个条件表达式,表达式包含两个参数,以逗号分隔,表达式以圆括号括起。else表示条件表达式为假的情况。endif表示一个条件语句的结束,任何一个条件表达式都应该以endif结束。
当我们的变量$(CC)值是“gcc”时,目标foo的规则是:
foo: $(objects)
$(CC) -o foo $(objects) $(libs_for_gcc)
而当我们的变量$(CC)值不是“gcc”时(比如“cc”),目标foo的规则是:
foo: $(objects)
$(CC) -o foo $(objects) $(normal_libs)
当然,我们还可以把上面的那个例子写得更简洁一些:
libs_for_gcc = -lgnu
normal_libs =
ifeq ($(CC),gcc)
libs=$(libs_for_gcc)
else
libs=$(normal_libs)
endif
foo: $(objects)
$(CC) -o foo $(objects) $(libs)
二、语法
条件表达式的语法为:
;
;
endif
以及:
;
;
else
;
endif
其中;表示条件关键字,如“ifeq”。这个关键字有四个。
第一个是我们前面所见过的“ifeq”
ifeq (;, 😉
ifeq ';' ';'
ifeq "
;" "

;"

ifeq "

;" '

;'

ifeq '

;' "

;"

比较参数“arg1”和“arg2”的值是否相同。当然,参数中我们还可以使用make的函数。如:

ifeq ($(strip $(foo)),)

;

endif

这个示例中使用了“strip”函数,如果这个函数的返回值是空(Empty),那么

;就生效。

第二个条件关键字是“ifneq”。语法是:

ifneq (

;,

😉

ifneq '

;' '

;'

ifneq "

;" "

阅读更多 >>>  linux命令v

;"

ifneq "

;" '

;'

ifneq '

;' "

;"

其比较参数“arg1”和“arg2”的值是否相同,如果不同,则为真。和“ifeq”类似。

第三个条件关键字是“ifdef”。语法是:

ifdef

;

如果变量

;的值非空,那到表达式为真。否则,表达式为假。当然,

;同样可以是一个函数的返回值。注意,ifdef只是测试一个变量是否有值,其并不会把变量扩展到当前位置。还是来看两个例子:

示例一:

bar =

foo = $(bar)

ifdef foo

frobozz = yes

else

frobozz = no

endif

示例二:

foo =

ifdef foo

frobozz = yes

else

frobozz = no

endif

第一个例子中,“$(frobozz)”值是“yes”,第二个则是“no”。

第四个条件关键字是“ifndef”。其语法是:

ifndef

;

这个我就不多说了,和“ifdef”是相反的意思。

;这一行上,多余的空格是被允许的,但是不能以[Tab]键做为开始(不然就被认为是命令)。而注释符“#”同样也是安全的。“else”和“endif”也一样,只要不是以[Tab]键开始就行了。

特别注意的是,make是在读取Makefile时就计算条件表达式的值,并根据条件表达式的值来选择语句,所以,你最好不要把自动化变量(如“$@”等)放入条件表达式中,因为自动化变量是在运行时才有的。

而且,为了避免混乱,make不允许把整个条件语句分成两部分放在不同的文件中。

linux makefile或命令前的@有什么意义

$@是Makfile里的一种自动化变量,代表目前规则中所有的目标的集合,在模式规则中,如果有多个目标,那么,"$@"就是匹配于目标中模式定义的集合。
Makefile规则语法
targets : prerequisites
command
...
$@就是对应targets目标集合。
举个例子具体说明:
objects = t1.o t2.o
$(objects): %.o: %.c
$(CC) -c $(CFLAGS) $< -o $@
这里objects包含两个目标,t1.o和t2.o,$@就代表objects,也即{t1.o t2.o}这个目标集合。
ssh user@127.0.0.1:8080也有这个;
@在Makefile一般用来解析shell命令,

@if [ ! -d $(CPU) ]; then mkdir $(CPU); fi
后面跟的是shell的判断语句。
你可以用@把shell命令放在Makefile中执行。

makefile里怎么表达elseif

用嵌套吧
ifeq ...
...
else
ifeq ...
...
else
...
endif
endif
答案仅供参考。
makefile 语法里没有直接类似if...elseif...else.....的这种结构,但是有类似 if ...else ...语句的结构: ifeq...else...endif。所以可用嵌套的方式 实现if...elseif...else.....的这种结构
ifeq (

,

)表示 if(

等于

)

例如:

ifeq ($(CC),gcc)

libs=$(libs_for_gcc)

else

ifeq ($(CC),gplus)

libs=$(libs_for_gplus)

else

libs=$(normal_libs)

endif

endif

makefile中的$@

1、$@表示规则的当前目标文件名。
-o表示指定输出文件名,-o $@表示输出test.o
2、是makefile中的语法

Ubuntu下面Makefile的使用方法

运行可执行文件hello
./hello
移除文件 rm hello
编译文件得到可执行文件的同时,保留产生的中间文件
g++ -save-temps hello_world.cpp -o hello
单个文件编译过程: 实际的编译过程:预处理,对应临时文件hello_world.ii
g++ -E hello_world.cpp -o preprocessed.ii
cat preprocessed.ii
预处理的工作主要包含去掉注释,然后将我们include的库tack上,以上过程使我们自己主动调用预处理器的过程
cat hello_world.ii
则展示了我们在第5)中编译时保留的中间文件,两者是一样的
实际的编译过程:这是真正的编译过程compilation step,对应临时文件hello_world.s(assembly code)
我们自己把.ii文件进行assembly code得到.s的方法。
g++ -S preprocessed.ii -o complied.s
.s文件是高级语言和机器语言之间的中间环节
实际的编译过程:Assembly,将.s对应的assembly code转换成.o对应的机器语言的过程,也叫machine-readable code或者object code
让编译器将.s文件assembly起来
g++ -c complied.s -o assembled.o
实际的编译过程:最后一步Linking,产生最终的可执行文件。
"Undefined reference" errors are pretty much always linking errors, and you will probably have them. Remember this.
我们通过连接一堆.o文件,得到.exe文件的过程,命令:
g++ assembled.o -o hello_manual
多个文件编译过程: 举例,如果我们有定义一个class,然后我们的文件中包含dog.hpp,dog.cpp和main.cpp三个文件,然后我们只使用以下两个命令:
g++ -c main.cpp -o main.o
g++ main.o dog_program
的话就会出错,告诉我们undefined reference of dog::bark()
因为对于不同的.cpp文件,都要生成一个object file,也就是.o文件。所以如果我们用以下命令:
g++ -c main.cpp -o main.o
g++ -c dog.cpp
g++ dog.o main.o -o dog_program
的话,就不会出错。
我们如果修改main.cpp中的内容的话,我们只需要重新用最后一个连接命令。但是,如果我们修改了dog class本身的内容的话,例如添加一个函数,我们就需要重新产生object file of dog.cpp,然后重新连接。
关于Make的介绍 用自己常用的记事本创建一个Makefile,并注意大小写。在program对应的目录下面。
gedit Makefile
Makefile里面语句的书写规则是
Target: tgt_dependency1 tgt_dependency2 …… Command
所以dog.o和main.o对应的语句分别是:
dog.o: dog.hpp dog.cpp g++ -c dog.cpp
main.o: main.cpp g++ -c main.cpp
在Makefile中Tab是很重要的,所以不要忘记在command对应的第二行加Tab
Makefile的编译顺序
如果Makefile中有如下语句
animal_assembly : moose goose cat command
moose : antlers hooves fur command
goose : beak wings webbed_feet interest_in_bread command
cat : whiskers evil_personality command
我们可以看到animal_assembly的dependency是 moose goose cat。如果文件夹中存在moose goose cat的话,make命令只需要执行第一句就可以了。如果文件夹中缺少moose goose cat中的一个或者几个,make命令执行的时候,需要先找到moose goose cat的生成方法,然后执行对应的命令,最后执行animal_assembly生成的命令。
moose : antlers hooves fur command
animal_assembly : moose goose cat command
goose : beak wings webbed_feet interest_in_bread command
cat : whiskers evil_personality command
如果Makefille是以上形式的话,我们只运行make的话,Makefile会只执行第一句,因为第一句的dependency都存在了,所以只把moose生成的命令执行完就好了。如果我们要生成animal_assembly,就要运行命令make animal_assembly。所以,我们需要把最重要的命令,我们最重要生成的object file对应的命令放在第一行。
所以我们的dog_program的完整的Makefile文件应该是:
dog_program: dog.o main.o g++ dog.o main.o -o dog_program
dog.o: dog.hpp dog.cpp g++ -c dog.cpp
main.o: main.cpp g++ -c main.cpp
在Makefile的最后写clean语句。
clean: rm dog_program *.o
然后我们在命令窗口运行make clean的话,就会删除文件夹中生成的可执行文件,和所有过程中产生的副产品。
对于Makefile中的dependency list,我们需要将每个object file的dependency list都写好。因为make不负责检查文件中的具体的语句,只负责执行Makefile中的语句。
dog_program: g++ dog.o main.o -o dog_program
dog.o: dog.hpp dog.cpp g++ -c dog.cpp
main.o: main.cpp g++ -c main.cpp
如果像上面所示去掉dog_program的dependency list的话,运行make就会出错,因为main是依赖于dog.cpp的。
如果文件中本身就存在dog.o和main.o的话,运行make不会出错,因为make就是先check dog.o main.o是否存在,存在的话就直接运行。
所以,我们如果修改了main.cpp或者dog.cpp的话,我们需要重新生成dog.o和main.o。因为make是不管这个问题的。
make这个命令的功能就是执行Makefile中我们要求执行的语句,对结果没有任何的预期,也不会检查命令有没有问题。所以,我们必须遵守Makefile书写中的一些规则。
all : fill_file_with_nonsense echo "I have mostly created a lot of junk today!"
fill_file_with_nonsense : create_file echo "Hello, there is nothing important here" > silly_file
create_file : touch silly_file touch是Unix中的典型命令,用于生成空的文件
move_file : mv silly_file silly_file_new_name
delete_file : rm _file
open_file : gedit another_silly_file
clean : touch junk1 junk2 junk3 junk4 junk5
really_clean : rm junk*
如果想体验的更加清楚,就可以运行这个文件中的内容,然后就知道make完全不会管结果是什么,只是没有脑子的执行命令。
解释上面的内容:
Makefile的书写规则。all: 放在第一句,把所以我们要生成executable依赖的Targets列出来,这样我们需要的所有的文件都可以生成。我们看到all对应的dependency是file_file_with_nonsense,就去找file_file_with_nonsense的生成语句,发现它的dependency是create_file,然后去找create_file的生成语句,就到touch silly_file,touch是Unix中的典型命令,用于生成空的文件。create_file的语句执行完之后,回到file_file_with_nonsense,执行echo "Hello, there is nothing important here" > silly_file,就把"Hello, there is nothing important here" 写入silly_file中,file_file_with_nonsense的语句也执行完之后,我们就返回到all,然后在命令行输出"I have mostly created a lot of junk today!"。
因为其他的target,不在all的dependency list中,也不在all的dependency的dependency当中,所以只能通过make target的形式来调用对应的命令。
Marvelous macros(宏) 一个宏的示例,宏就是Makefile中的variables,用来定义我们需要的操作,一些变量之类的
CXX = clang++
FLAGS = -O
hello : hello_world.cpp $(CXX) $(FLAGS) $? -o $@
clean : rm hello
CXX,这是一个预定义的宏,default value是g++。这里把CXX定义成clang++了。
FLAGS,这里定义的是-O。FLAGS也不一定非得定义成-o,也可以是some moose have large antlers,但是这样定义的话,就会导致调用的时候出错。
对于上面的文件,我们在命令行输入make的时候,实际运行的是clang++ -O hello_world.cpp -o hello。
如果我们把CXX=clang++这一行删掉的话,在命令行输入make,实际运行的就是g++ -O hello_world.cpp -o hello。
定义好macro宏,我们使用的时候,就要用$(MACRO)这样的形式,这是makefile语言的一种语法。我们注意到MACRO全部用的大写,虽然不是明确规定的,但是通常情况下用大写。
$?和$@是makefile language里面特别的预定义的宏。$?是指的"names of the dependencies(newer than the target)",$@是指的"name of the target"。
Complier and liner flags in CS 225
CXX = clang++ LD = clang++
CXXFLAGS = -std=c++1y -stdlib=libc++ -c -g -O0 -Wall -Wextra -Werror -pedantic
LDFLAGS = -std=c++1y -stdlib=libc++ -lpng -lc++abi

阅读更多 >>>  linuxmakeall命令

网站数据信息

"makefile语法,makefile怎么用?"浏览人数已经达到17次,如你需要查询该站的相关权重信息,可以点击进入"Chinaz数据" 查询。更多网站价值评估因素如:makefile语法,makefile怎么用?的访问速度、搜索引擎收录以及索引量、用户体验等。 要评估一个站的价值,最主要还是需要根据您自身的需求,如网站IP、PV、跳出率等!