| 在这里插入代码片
| |
|–|--|工程目录的搭建
pro_name----------------------------------bin
|
|-------------------------obj
|
|-------------------------include
|
|-------------------------src
bin:这个文件夹来存放编译生成的文件(可执行文件/动态库)
obj:编译出的目标文件
include:工程中需要的头文件
src:工程中的.c源文件
当工程较大时,编译对于开发来说已经相当浪费时间了,此时,有专门工程管理工具来使用。
GNU make
cmake
工作时:cmake
原始的工具:make (GNU提供一个工程管理工具)
makefile
make是按照makefile编写的规则来进行编译的。
makefile的编写:
如果你执行make,make会自动寻找工程目录下,名字如下的文件:
GNUmakefile (不常用)
makefile
Makefile
makefile的编写规则:
Makefile基本框架
Makefile的构成: target(由make工具创建的目标体,通常是目标文件或可执行文件)
prerequisites(先决条件,前提:这个前提是一个作为gcc source的文件,一个target通常需要好几个文件)
recipe(处方:是一个make执行的动作。一个recipe可能有多个命令,无论是在同一行或每一个自己的行。
请注意:你需要放一个标签字符在每一recipeline的开始!这个可以避免一些粗心造成的错误。如果你更为喜欢你的recipe的前缀字符,你可以设置.recipeprefix变量到另一个字符)
简单的Makefile格式:
target ... : prerequisites ...
<TAB>recipe
<TAB>...
<TAB>...
变量:
自定义变量:
iopt = WOMAN
TY : tjpy.c
gcc $^ -D ${iopt} -o $@
注意在使用时,如果变量名和关键字有冲突 ${变量名}:取到变量的值
make和shell是不同两个软件,两个软件的脚本编写规则是有些差异的,不要记混了。
常见的自动变量:
$*:不包含扩展名的目标文件
$+:所有的依赖文件,以空格分开,并以出现的先后为序
$<:第一个依赖文件的名称
$?:所有时间戳比目标文件晚的依赖文件,并以空格分开
$@:目标文件的完整名称 ******(匹配的是当前的目标)
$^:所有不重复的目标依赖文件,以空格隔开 ******
$%:如果目标是归档成员,则该变量表示目标的归档成员名称
例子:
iopt = WOMAN
TY : tjpy.c
gcc $^ -D ${iopt} -o $@
#gcc tjpy.c -D MAN -o TY
#echo $@
#echo $^
.PHONY : clean
clean:
rm TY
注意:
1.通过".PHONY"特殊目标将"clean"目标声明为伪目标。避免当前目录上存在一个名为"clean"文件时,
目标"clean"所在规则的命令无法执行。
make -C dirname:进入dirname这个文件夹执行make
| | |