Linux程序设计:make和makefile
2014-08-26 16:34
204 查看
make和Makefile
当我们编写的程序较大时,不可避免会有很多的源文件不可避免有时这些文件会存在很多相互引用的问题,如果其中一些文件发生改变,就必须重新编译文件,但是另一方面如果编译全部文件的代价是巨大的,所以我们必须知道那些文件有依赖关系,make为我们提供一个很好的工具去管理这些关系,Makefile的编写是很让人很痛苦的。但是我们的另一方面我们必须很好的掌握它
关于make的参数:
-k 他的作用是让make在发现一个错误时仍继续执行下去,而不是马上停下来,这样可以让我们一次性将所有的错误都找出来
-n 输出将执行的步骤,而不是真正的执行他。
-f <filename> 告诉makeh将那个文件作为Makefile,如果不指定文件名,就将在当前的目录下搜索Makefile这个文件如果找不到就会找寻Makefile。make如果不指定创建文件的名字。那么他将创建makefile的第一个目标
所以很多时候我们会将第一个目设为all,然后再列出其他的从从属目标这样的目的是,明确的告诉make在未指定目标文件时,默认情况下应该创建那个文件
下面是例子:
myapp:: main .o 2.o 3.o定义了要生成myapp需要的文件
然后下面的一行定义了生成文件需要的命令(注意:这一行的开头是以TAB开头的)
makefile里的注释符是#
makefile里的宏定义:
例子: CC=gcc $(CC)
这里之所以要将gcc定义为宏是因为:
不同的系统下的编译器可能不同而我们如果在执行make时指定了CC的值,那么新的值将覆盖原来的值
一些特殊的宏定义:
$?
当前依赖文件列表中比目标还要新的文件
$@--目标文件,
$^--所有的依赖文件,
$<--第一个依赖文件。
另外我们还经常在Makefile的命令看到下面两个符号
-告诉告诉make命令忽略所有的错误,@告诉make在执行某条命令前不要命令显示在标准输出上
另外make还内置大量的内置规则来简化编写,大家可以通过:make -p来查看这些规则
关于创建自己的规则 以让一个就的后缀名能生成新的后最名的文件,我们以.cpp到文件.cpp的生成作为例子就一目了然:
.SUFFIXES: .cpp
.cpp.o:
$(CC) -xc++ $(CFCLASS) -i$(INCLUDE) -c $<
其中的-xc++ 就是告诉gcc编译器这是一个C++源文件
Makefile中的如果想用库文件包含一个源文件只需要:.a(.o)的形式就好了
有时候我们需要将构成库文件的几个从其他文件中分离出来放在一个子文件中
我们可以在子目录中编写第二个Makefile文件这个文件就是将几个文件包含到库文件中去,然后在主文件中加入:
mylib.a
(cd mylibdirectory;$(MAKE))
这个规则的意思是 切换到然后执行另外的make,注意的是这个()很重要,它保证了两个命令都在同一个shell中被执行
最后要注意的是:
make -JN这个选项可以同时执行多个命令 (如:-j3)
gcc -MM 可以产生目标文件的依赖清单
当我们编写的程序较大时,不可避免会有很多的源文件不可避免有时这些文件会存在很多相互引用的问题,如果其中一些文件发生改变,就必须重新编译文件,但是另一方面如果编译全部文件的代价是巨大的,所以我们必须知道那些文件有依赖关系,make为我们提供一个很好的工具去管理这些关系,Makefile的编写是很让人很痛苦的。但是我们的另一方面我们必须很好的掌握它
关于make的参数:
-k 他的作用是让make在发现一个错误时仍继续执行下去,而不是马上停下来,这样可以让我们一次性将所有的错误都找出来
-n 输出将执行的步骤,而不是真正的执行他。
-f <filename> 告诉makeh将那个文件作为Makefile,如果不指定文件名,就将在当前的目录下搜索Makefile这个文件如果找不到就会找寻Makefile。make如果不指定创建文件的名字。那么他将创建makefile的第一个目标
所以很多时候我们会将第一个目设为all,然后再列出其他的从从属目标这样的目的是,明确的告诉make在未指定目标文件时,默认情况下应该创建那个文件
下面是例子:
<span style="font-size:18px;">myapp: main.o 2.o 3.o gcc -o myapp main.o 2.o 3.o </span>
myapp:: main .o 2.o 3.o定义了要生成myapp需要的文件
然后下面的一行定义了生成文件需要的命令(注意:这一行的开头是以TAB开头的)
makefile里的注释符是#
makefile里的宏定义:
例子: CC=gcc $(CC)
这里之所以要将gcc定义为宏是因为:
不同的系统下的编译器可能不同而我们如果在执行make时指定了CC的值,那么新的值将覆盖原来的值
一些特殊的宏定义:
$?
当前依赖文件列表中比目标还要新的文件
$@--目标文件,
$^--所有的依赖文件,
$<--第一个依赖文件。
另外我们还经常在Makefile的命令看到下面两个符号
-告诉告诉make命令忽略所有的错误,@告诉make在执行某条命令前不要命令显示在标准输出上
另外make还内置大量的内置规则来简化编写,大家可以通过:make -p来查看这些规则
关于创建自己的规则 以让一个就的后缀名能生成新的后最名的文件,我们以.cpp到文件.cpp的生成作为例子就一目了然:
.SUFFIXES: .cpp
.cpp.o:
$(CC) -xc++ $(CFCLASS) -i$(INCLUDE) -c $<
其中的-xc++ 就是告诉gcc编译器这是一个C++源文件
Makefile中的如果想用库文件包含一个源文件只需要:.a(.o)的形式就好了
有时候我们需要将构成库文件的几个从其他文件中分离出来放在一个子文件中
我们可以在子目录中编写第二个Makefile文件这个文件就是将几个文件包含到库文件中去,然后在主文件中加入:
mylib.a
(cd mylibdirectory;$(MAKE))
这个规则的意思是 切换到然后执行另外的make,注意的是这个()很重要,它保证了两个命令都在同一个shell中被执行
最后要注意的是:
make -JN这个选项可以同时执行多个命令 (如:-j3)
gcc -MM 可以产生目标文件的依赖清单
相关文章推荐
- linux程序设计笔记9:make,makefile
- linux程序设计——make命令和makefile文件(第九章)
- Linux程序设计——make命令与makefile文件
- Linux程序设计笔记第九章 make命令和makefile文件
- linux程序设计:make命令和makefile文件
- linux程序设计——make命令和makefile文件(第九章)
- Linux Make(Makefile)由浅入深的学习与示例剖析
- Linux/Unix环境下的make和makefile详解(zz)
- Linux/Unix环境下的make和makefile详解
- [转]Linux/Unix环境下的Make和Makefile详解
- Linux/Unix环境下的make和makefile详解
- Linux环境下make和makefile详解
- Linux/Unix环境下的make和makefile详解
- Linux/Unix环境下的make和makefile详解(非常详细, 推荐!)
- linux学习笔记-读《Linux编程技术详解》(2)-make与makefile
- 简单 用 Linux automake 生成 Makefile
- Linux/Unix环境下的Make和Makefile详解
- Maemo Linux手机平台系列分析:(17) Maemo应用开发: GNU make 与makefile
- Linux/Unix环境下的Make和Makefile
- Linux/Unix环境下的Make和Makefile详解