makefile

来源:互联网 发布:python开发工具 编辑:程序博客网 时间:2024/06/04 19:26

http://www.cnblogs.com/Daniel-G/p/3286614.html

基本格式如下:

target:dependency_files

<TAB>command


命令以TAB开头 

3个预定义变量介绍:

1.  $@     表示要生成的目标

2.  $^     表示全部的依赖文件

3.  $<     表示第一个依赖文件


注释:注释符用"#",可以用反斜框进行转义,如输入注释,“\#


Make命令本身可带有四种参数:标志、宏定义、描述文档名和目标文档名。其标准形式为: 
  Make [flags] [macro definitions] [targets] 

-f file  指定file文档为描述文档.假如没有"-f"参数,则系统将默认当前目录下名为makefile或名为Makefile的文档为描述文档。在Linux中, GNU make 工具在当前工作目录中按照GNUmakefile、makefile、Makefile的顺序搜索 makefile文档。

-c dir   在读取 makefile 之前改变到指定的目录dir。

-w   在处理 makefile 之前和之后,都显示工作目录。

$(MAKECMDGLOBALS) 获取targets



gcc 的3个参数:

1. -o 指定输出文件名(包括对象文件,可执行文件2)

gcc sources/main.c -o bin/main

2. -c 编译的时候只生产目标文件不链接

gcc -c sources/main.c -o obj/main.o

3. -I 主要指定头文件的搜索路径

gcc -I headers -c main.c -o main.o

4. -l 指定静态库

gcc -lpthread ...


g++ helloworld.cpp

编译器默认的动作:编译源代码文件生成对象文件(object file),链接对象文件和 libstd c++ 库中的函数得到可执行程序。然后删除对象文件。由于命令行中未指定可执行程序的文件名,编译器采用默认的 a.out。

程序 g++ 是将 gcc 默认语言设为 C++ 的一个特殊的版本,链接时它自动使用 C++ 标准库而不用 C 标准库。通过遵循源码的命名规范并指定对应库的名字,用 gcc 来编译链接 C++ 程序是可行的,如下例所示: 
$ gcc helloworld.cpp -lstdc++ -o helloworld
选项 -l (ell) 通过添加前缀 lib 和后缀 .a 将跟随它的名字变换为库的名字 libstdc++.a。而后它在标准库路径中查找该库。gcc 的编译过程和输出文件与 g++ 是完全相同的。


创建静态库 
静态库是编译器生成的一系列对象文件的集合。链接一个程序时用库中的对象文件还是目录中的对象文件都是一样的。库中的成员包括普通函数,类定义,类的对象实例等等。静态库的另一个名字叫归档文件(archive),管理这种归档文件的工具叫 ar 。 

下面的命令序列将源码文件编译成对象文件,命令 ar 将其存进库中: 
$ g++ -c sayhello.cpp
$ g++ -c say.cpp
$ ar -r libsay.a sayhello.o say.o
程序 ar 配合参数 -r 创建一个新库 libsay.a 并将命令行中列出的对象文件插入。采用这种方法,如果库不存在的话,参数 -r 将创建一个新的库,而如果库存在的话,将用新的模块替换原来的模块。 


在Makefile规则中,通配符会被自动展开。但在变量的定义和函数引用时,通配符将失效这种情况下如果需要通配符有效,就需要使用函数“wildcard,它的用法是:$(wildcard PATTERN...) 

一般我们可以使用$(wildcard *.c)”来获取工作目录下的所有的.c文件列表。复杂一些用法;可以使用“$(patsubst %.c,%.o,$(wildcard *.c))”,首先使用“wildcard”函数获取工作目录下的.c文件列表;之后将列表中所有文件名的后缀.c替换为.o

1、wildcard : 扩展通配符
2、notdir : 去除路径
3、patsubst :替换通配符


%为Makefile规则通配符,一般用于规则描述,如%.o:%c    $(CC)  $< -o $@表示所有的目标文件及其依赖文件.$(filter %.c ,SOURCES)此处SOURCES表示包含.c .cc .cpp等多类型源文件,该过滤器函数将c文件过滤出来,而%.c即为此过滤器规则。
call 函数是唯一一个可以用来创建新的参数化的函数。你可以写一个非常复杂的表达式, 

这个表达式中,你可以定义许多参数,然后你可以用call函数来向这个表达式传递参 数。其语法是:

$(call <expression>,<parm1>,<parm2>,<parm3>...)

当make执行这个函数时,<expression>参数中的变量,如$(1),$(2),$(3)等,会被参 数<parm1>,<parm2>,<parm3>依次取代。而<expression>的返回值就是call函数的返 回值。例如:

reverse = $(1) $(2)

foo = $(call reverse,a,b)

那么,foo的值就是“ab”。当然,参数的次序是可以自定义的,不一定是顺序的,如: reverse = $(2) $(1)

foo = $(call reverse,a,b)

此时的foo的值就是“ba”

一般来说,在默认情况下,在程序崩溃时,core文件是不生成的(很多Linux发行版在默认时禁止生成核心文件)。所以,你必须修改这个默认选项,在命令行执行:
ulimit -c unlimited     //unlimited 表示不限制生成的core文件的大小


0 0
原创粉丝点击