makefile与gnu参数说明.docx
- 文档编号:28929851
- 上传时间:2023-07-20
- 格式:DOCX
- 页数:17
- 大小:24.60KB
makefile与gnu参数说明.docx
《makefile与gnu参数说明.docx》由会员分享,可在线阅读,更多相关《makefile与gnu参数说明.docx(17页珍藏版)》请在冰豆网上搜索。
makefile与gnu参数说明
g++/gcc参数介绍
gccandg++分别是gnu的c&c++编译器
gcc/g++在执行编译工作的时候,总共需要4步
1.预处理,生成.i的文件
预处理器cpp
2.将预处理后的文件不转换成汇编语言,生成文件.s
编译器egcs
3.有汇编变为目标代码(机器代码)生成.o的文件
汇编器as
4.连接目标代码,生成可执行程序
连接器ld
1.总体选项
-E
只激活预处理,这个不生成文件,你需要把它重定向到一个输出文件里
面.
例子用法:
gcc-Ehello.c>pianoapan.txt
gcc-Ehello.c|more
慢慢看吧,一个helloword也要与处理成800行的代码
-S
只激活预处理和编译,就是指把文件编译成为汇编代码。
例子用法
gcc-Shello.c
他将生成.s的汇编代码,你可以用文本编辑器察看
-c
只激活预处理,编译,和汇编,也就是他只把程序做成obj文件
例子用法:
gcc-chello.c
他将生成.o的obj文件
2.目录选项
-Idir
在你是用#include"file"的时候,gcc/g++会先在当前目录查找你所制定的头
文件,如果没有找到,他回到缺省的头文件目录找,如果使用-I制定了目录,他
回先在你所制定的目录查找,然后再按常规的顺序去找.
对于#include,gcc/g++会到-I制定的目录查找,查找不到,然后将到系
统的缺省的头文件目录查找
-includefile
-i
相当于“#include”
包含某个代码,简单来说,就是便以某个文件,需要另一个文件的时候,就可以
用它设定,功能就相当于在代码中使用#include
例子用法:
gcchello.c-include/root/pianopan.h
-I-
就是取消前一个参数的功能,所以一般在-Idir之后使用
-idirafterdir
在-I的目录里面查找失败,讲到这个目录里面查找.
-iprefixprefix
-iwithprefixdir
一般一起使用,当-I的目录查找失败,会到prefix+dir下查找
-Ldir
制定编译的时候,搜索库的路径。
比如你自己的库,可以用它制定目录,不然
编译器将只在标准库的目录找。
这个dir就是目录的名称。
-llibrary
制定编译的时候使用的库
例子用法
gcc-lcurseshello.c
使用ncurses库编译程序
3.调试选项
-g
只是编译器,在编译的时候,产生调试信息。
-gstabs
此选项以stabs格式声称调试信息,但是不包括gdb调试信息.
-gstabs+
此选项以stabs格式声称调试信息,并且包含仅供gdb使用的额外调试信息.
-ggdb
此选项将尽可能的生成gdb的可以使用的调试信息.
-glevel
请求生成调试信息,同时用level指出需要多少信息,默认的level值是2
“-n”或“--just-print”,
其只是显示makefile命令,但不会执行命令
“-s”或“--slient”
则是全面禁止命令的显示
4.链接方式选项:
-static 此选项将禁止使用动态库。
--static-libgcc 链接静态libgcc库
优点:
程序运行不依赖于其他库
缺点:
文件比较大
-shared (-G)此选项将尽量使用动态库,为默认选项--shared-libgcc链接动态libgcc库
优点:
生成文件比较小
缺点:
运行时需要系统提供动态库
-symbolic 建立共享目标文件的时候,把引用绑定到全局符号上.
对所有无法解析的引用作出警告(除非用连接编辑选项`-Xlinker-z-Xlinkerdefs'取代)。
注:
只有部分系统支持该选项.
5.错误与告警选项
-Wall 一般使用该选项,允许发出GCC能够提供的所有有用的警告。
也可以用-W{warning}来标记指定的警告。
-pedantic 允许发出ANSI/ISOC标准所列出的所有警告
-pedantic-errors 允许发出ANSI/ISOC标准所列出的错误
-werror 把所有警告转换为错误,以在警告发生时中止编译过程
-w 关闭所有警告,建议不要使用此项
6.预处理选项
-Dmacro
相当于C语言中的#definemacro
-Dmacro=defn
相当于C语言中的#definemacro=defn
-Umacro
相当于C语言中的#undefmacro
-undef
取消对任何非标准宏的定义
7.其他选项
-o
制定目标名称,缺省的时候,gcc编译出来的文件是a.out,很难听,如果你和我有同感,改掉它,哈哈
例子用法
gcc-ohello.exehello.c(哦,windows用习惯了)
gcc-ohello.asm-Shello.c
-O0
-O1
-O2
-O3
编译器的优化选项的4个级别,-O0表示没有优化,-O1为缺省值,-O3优化级别最高
-fpic 编译器就生成位置无关目标码.适用于共享库(sharedlibrary).
-fPIC 编译器就输出位置无关目标码.适用于动态连接(dynamiclinking),即使分支需要大范围转移.
-v 显示详细的编译、汇编、连接命令
-pipe
使用管道代替编译中临时文件,在使用非gnu汇编工具的时候,可能有些问题
gcc-pipe-ohello.exehello.c
-ansi
关闭gnuc中与ansic不兼容的特性,激活ansic的专有特性(包括禁止一些asminlinetypeof关键字,以及UNIX,vax等预处理宏,
-fno-asm
此选项实现ansi选项的功能的一部分,它禁止将asm,inline和typeof用作关键字。
-fno-strict-prototype
只对g++起作用,使用这个选项,g++将对不带参数的函数,都认为是没有显式的对参数的个数和类型说明,而不是没有参数.而gcc无论是否使用这个参数,都将对没有带参数的函数,认为城没有显式说明的类型
-fthis-is-varialble
就是向传统c++看齐,可以使用this当一般变量使用.
-fcond-mismatch
允许条件表达式的第二和第三参数类型不匹配,表达式的值将为void类型
-funsigned-char
-fno-signed-char
-fsigned-char
-fno-unsigned-char
这四个参数是对char类型进行设置,决定将char类型设置成unsignedchar(前
两个参数)或者signedchar(后两个参数)
-imacrosfile
将file文件的宏,扩展到gcc/g++的输入文件,宏定义本身并不出现在输入文件中
-nostdinc
使编译器不再系统缺省的头文件目录里面找头文件,一般和-I联合使用,明确限定头文件的位置
-nostdinC++
规定不在g++指定的标准路经中搜索,但仍在其他路径中搜索,.此选项在创建libg++库使用
-C
在预处理的时候,不删除注释信息,一般和-E使用,有时候分析程序,用这个很方便的
-M
生成文件关联的信息。
包含目标文件所依赖的所有源代码你可以用gcc-Mhello.c来测试一下,很简单。
-MM
和上面的那个一样,但是它将忽略由#include造成的依赖关系。
-MD
和-M相同,但是输出将导入到.d的文件里面
-MMD
和-MM相同,但是输出将导入到.d的文件里面
-Wa,option
此选项传递option给汇编程序;如果option中间有逗号,就将option分成多个选项,然后传递给会汇编程序
-Wl.option
此选项传递option给连接程序;如果option中间有逗号,就将option分成多个选项,然后传递给会连接程序.
-xlanguagefilename
设定文件所使用的语言,使后缀名无效,对以后的多个有效.也就是根
据约定C语言的后缀名称是.c的,而C++的后缀名是.C或者.cpp,如果
你很个性,决定你的C代码文件的后缀名是.pig哈哈,那你就要用这
个参数,这个参数对他后面的文件名都起作用,除非到了下一个参数
的使用。
可以使用的参数吗有下面的这些
`c’,`objective-c’,`c-header’,`c++’,`cpp-output’,
`assembler’,and`assembler-with-cpp’.
看到英文,应该可以理解的。
例子用法:
gcc-xchello.pig
-xnonefilename
关掉上一个选项,也就是让gcc根据文件名后缀,自动识别文件类型
例子用法:
gcc-xchello.pig-xnonehello2.c
_REENTRANT
这个宏的定义必须出现于程序中的任何#include语句之前,它做三件事情:
(1)它会对部分函数重新定义它们的可安全重入的版本,这些函数名字一般不会发生改变,只是会在函数名后面添加_r字符串,如函数名gethostbyname变成gethostbyname_r。
(2)stdio.h中原来以宏的形式实现的一些函数将变成可安全重入函数。
(3)在error.h中定义的变量error现在将成为一个函数调用,它能够以一种安全的多线程方式来获取真正的errno的值。
D_GNU_SOURCE
含有信号量/读写锁文件进行编译或者链接时需要加此选项
-std=gnu++0x
C++新标准,新特性
//////////////////////////////////////////////////////////////////////////////////////
语法
ifeq($(CC),gcc)//如果变量CC的值等于“gcc”
$(CC)-ofoo$(objects)$(libs_for_gcc)
else
$(CC)-ofoo$(objects)$(normal_libs)
endif
操作符说明:
:
=-->前面的变量不能使用后面的变量,只能使用前面已定义好了的变量。
如果是这样:
y:
=$(x)bar
x:
=foo
那么,y的值是“bar”,而不是“foobar”。
?
=-->FOO?
=bar:
如果FOO没有被定义过,那么变量FOO的值就是“bar”,如果FOO先前被定义过,那么这条语将什么也不做,其等价于:
ifeq($(originFOO),undefined)
FOO=bar
endif
替换:
$(var:
a=b)/${var:
a=b}-->把变量“var”中所有以“a”字串“结尾”的“a”替换成“b”字串。
这里的“结尾”意思是“空格”或是“结束符”。
例子:
foo:
=a.ob.oc.o
bar:
=$(foo:
.o=.c)
把“$(foo)”中所有以“.o”字串“结尾”全部替换成“.c”,所以我们的“$(bar)”的值就是“a.cb.cc.c”。
define指示符后面跟的是变量的名字,而重起一行定义变量的值,定义是以endef关键字结束。
例
definetwo-lines
echofoo
echo$(bar)
endef
makefile中的shell
在Makefile中只能在target中调用Shell脚本,其他地方是不能输出的。
比如如下代码就是没有任何输出:
VAR="Hello"
echo"$VAR"
all:
.....
以上代码任何时候都不会输出,没有在target内,如果上述代码改为如下:
VAR="Hello"
all:
echo"$VAR"
.....
以上代码,在makeall的时候将会执行echo命令。
export
传递变量到下级Makefile中,export不带任何参数表示传递所有的变量
unexport
不想让某些变量传递到下级Makefile中
SHELL和MAKEFLAGS,这两个变量不管你是否export,其总是要传递到下层Makefile中
FOO?
=bar
其含义是,如果FOO没有被定义过,那么变量FOO的值就是“bar”,如果FOO先前被定义过,那么这条语将什么也不做,其等价于:
ifeq($(originFOO),undefined)
FOO=bar
Endif
“$(var:
a=b)”或是“${var:
a=b}”:
把变量“var”中所有以“a”字串“结尾”的“a”替换成“b”字串
注:
变量的值可以再作为变量使用
override指示符
如果有变量是通常make的命令行参数设置的,那么Makefile中对这个变量的赋值会被忽略。
如果你想在Makefile中设置这类参数的值,那么,你可以使用“override”指示符。
其语法是:
override
override
=
多行变量
使用define关键字设置变量的值可以有换行,这有利于定义一系列的命令;define指示符后面跟的是变量的名字,而重起一行定义变量的值,定义是以endef关键字结束
definetwo-lines
echofoo
echo$(bar)
endef
目标变量
把变量作用于某个目标上。
语法:
overide
例:
prog:
CFLAGS=-g
prog:
prog.ofoo.obar.o
不管全局的$(CFLAGS)的值是什么,在prog目标,以及其所引发的所有规则中,$(CFLAGS)的值都是“-g”
命令执行
如果你要让上一条命令的结果应用在下一条命令时,你应该使用分号分隔这两条命令,不能写在同一行上如:
exec:
cd/home/hchen;pwd
命令出错
Makefile的命令行前加一个减号“-”(在Tab键之后),标记为不管命令出不出错都认为是成功的,即忽略命
令出错。
如:
clean:
-rm-f*.o
“-i”或是“--ignore-errors”参数,那么,Makefile中所有命令都会忽略错误
“-k”或是“--keep-going”,这个参数的意思是,如果某规则中的命令出错了,那么就终目该规
则的执行,但继续执行其它规则。
soname、realname
静态库一般由字母lib开头,并有.a的扩展名,而共享对象有两个不同的名称:
soname和
realname;soname包含前缀"lib",然后紧跟库名,其次是".so"(后面紧跟另一个圆点),
以及表明主版本号的数字;soname可以由前缀的路径信息来限定。
realname是包含库的
已编译代码的真正文件名。
realname在soname后添加一个圆点、小的数字、另外一个圆点和发布号。
格式如下:
libxxxx.so.major.minor
其中,xxxx是库的名字,major是主版本号,minor是次版本号或叫发布号,次版本号和其
相应的圆点是可选的。
静态模式
静态模式可以更加容易地定义多目标的规则,可以让我们的规则变得更加的有弹性和灵活。
我们还是先来
看一下语法:
...
targets定义了一系列的目标文件,可以有通配符。
是目标的一个集合。
target-parrtern是指明了targets的模式,也就是的目标集模式。
prereq-parrterns是目标的依赖模式,它对target-parrtern形成的模式再进行一次依赖目标的定义。
这样描述这三个东西,可能还是没有说清楚,还是举个例子来说明一下吧。
如果我们的
义成“%.o”,意思是我们的集合中都是以“.o”结尾的,而如果我们的
对
是去掉了[.o]这个结尾),并为其加上[.c]这个结尾,形成的新集合。
例子:
objects=foo.obar.o
all:
$(objects)
$(objects):
%.o:
%.c
$(CC)-c$(CFLAGS)$<-o$@
上面的例子中,指明了我们的目标从$object中获取,“%.o”表明要所有以“.o”结尾的目标,也就是“foo.obar.o”,
也就是变量$object集合的模式,而依赖模式“%.c”则取模式“%.o”的“%”,也就是“foobar”,并为其加下“.c”
的后缀,于是,我们的依赖目标就是“foo.cbar.c”。
而命令中的“$<”和“$@”则是自动化变量,“$<”表示所有
的依赖目标集(也就是“foo.cbar.c”),“$@”表示目标集(也褪恰癴oo.obar.o”)。
于是,上面的规则展开后
等价于下面的规则:
foo.o:
foo.c
$(CC)-c$(CFLAGS)foo.c-ofoo.o
bar.o:
bar.c
$(CC)-c$(CFLAGS)bar.c-obar.o
函数:
字符串处理函数
1、$(subst
名称:
字符串替换函数——subst。
功能:
把字串
返回:
函数返回被替换过后的字符串。
-$(substoutput,,$@):
中的“$”表示执行一个Makefile的函数,函数名为subst,后面的为参数
2、$(patsubst
Patsubst-模式字符串替换函数
功能:
查找
式
这里,
表示任意长度的字串。
如果
将是
(可以用“\”来转义,以“\%”来表示真实含
义的“%”字符)返回:
函数返回被替换过后的字符串。
3、$(strip
名称:
去空格函数——strip。
功能:
去掉
返回:
返回被去掉空格的字符串值。
4、$(findstring
名称:
查找字符串函数——findstring。
功能:
在字串
返回:
如果找到,那么返回
5、$(filter
名称:
过滤函数——filter。
功能:
以
可
以有多个模式。
返回:
返回符合模式
6、$(filter-out
名称:
反过滤函数——filter-out。
功能:
以
可
以有多个模式。
返回:
返回不符合模式
7、$(sort)
名称:
排序函数——sort。
功能:
给字符串中的单词排序(升序)。
返回:
返回排序后的字符串。
示例:
$(sortfoobarlose)返回“barfoolose”。
8、$(word
名称:
取单词函数——word。
功能:
取字符串
(从一开始)
返回:
返回字符串
如果
字符串。
示例:
$(word2,foobarbaz)返回值是“bar”。
9、$(wordlist,
名称:
取单词串函数——wordlist。
功能:
从字符串开始到
和
返回:
返回字符串到
如果比
么返回空字符串。
如果开始,到
词串。
10、$(words
名称:
单词个数统计函数——words。
功能:
统计
返回:
返回
11、$(firstword
名称:
首单词函数——firstword。
功能:
取字符串
返回:
返回字符串
foreach函数
$(foreach
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- makefile gnu 参数 说明
![提示](https://static.bdocx.com/images/bang_tan.gif)