Makefile

 = 是最基本的赋值
:= 是覆盖之前的值
?= 是如果没有被赋值过就赋予等号后面的值
+= 是添加等号后面的值

 

make 会将整个 makefile 展开后,再决定变量的值。也就是说,变量的值将会是整个 makefile 中最后被指定的值。看例子:

      x = foo

      y = $(x) bar

      x = xyz

在上例中,y 的值将会是 xyz bar,而不是 foo bar。

 

2、“:=”

“:=”表示变量的值决定于它在 makefile 中的位置,而不是整个 makefile 展开后的最终值。

x := foo

y := $(x) bar

x := xyz

在上例中,y 的值将会是 foo bar,而不是 xyz bar 了


 

当 make 的目标为 all 时,-C $(KDIR) 指明跳转到源码目录下读取那里的 Makefile;M=$(PWD) 表明然后返回到当前目录继续读入、执行当前的 Makefile。


 

$var:将 Makefile 中的变量 var 的值,传给 shell 命令。

$$var:访问 shell 命令中定义的变量 var


 

带入 make 参数“-n”或“--just-print”,那么其只是显示命令

Makefile 有三个非常有用的变量。分别是$@,$^,$<代表的意义分别是:

$@--目标文件,$^--所有的依赖文件,$<--第一个依赖文件。


 

-fPIC 作用于编译阶段,告诉编译器产生与位置无关代码(Position-Independent Code),则产生的代码中,没有绝对地址,全部使用相对地址,故而代码可以被加载器加载到内存的任意位置,都可以正确的执行

如果不加-fPIC,则加载.so 文件的代码段时,代码段引用的数据对象需要重定位, 重定位会修改代码段的内容,这就造成每个使用这个.so 文件代码段的进程在内核里都会生成这个.so 文件代码段的 copy.


 

objects=main1.o foo.o main2.o bar.o

mains=main1.o main2.o

$(filter-out $(mains),$(objects))

实现了去除变量“objects”中“mains”定义的字串(文件名)功能。它的返回值为“foo.o bar.o”


 

-shared 编译链接库

-lxxx 指定需要动态链接的库文件

# -L 指定动态连接库文件的位置(编译时)

# . 指当前路径 

# 下面编译出的 libhello.so 文件已经显式依赖 libworld.so 文件,但是没有找到 libworld.so 的位置

 [root@localhost testc]# gcc -shared -fPIC -o libhello.so hello.c -lworld -L .


 

* 编译时链接库需要分为两类: 直接引用 间接引用

*  #inclue 

# 间接引用 被调用库的依赖库 

* -lxxx 指定具体的库名称,编译时需要显式指定直接引用的库名称

* -L 指定链接库的位置,编译时需要显式指定直接引用的库位置

-Wl

Pass option as an option to the linker. If option contains commas, it is split into multiple options at the commas. You can use this syntax to pass an argument to the option. For example, -Wl,-Map,output.map passes  -Map output.map to the linker. When using the GNU linker, you can also get the same effect with `-Wl,-Map=output.map'.

 

-rpath=dir

Add a directory to the runtime library search path. This is used when linking an ELF executable with shared objects. All -rpath arguments are concatenated and passed to the runtime linker, which uses them to locate shared objects at runtime. The -rpath option is also used when locating shared objects which are needed by shared objects explicitly included in the link;

-rpath: “运行”的时候,去找的目录。运行的时候,要找 .so 文件,会从这个选项里指定的地方去找

 

The man page makes it pretty clear. If you want to pass two arguments (-rpath and .) to the linker you can write

-Wl,-rpath,.

 

-rpath-link 这个也是用于“链接”的时候的,例如你显示指定的需要 FOO.so,但是 FOO.so 本身是需要 BAR.so 的,后者你并没有指定,而是 FOO.so 引用到它,这个时候,会先从 -rpath-link 给的路径里找


 

-I ,-L ,-l 这三个经常用,分别表示编译时include目录,库目录和所用的库


 

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


 

-Wno-xxx 忽略

-w的意思是关闭编译时的警告,也就是编译后不显示任何warning,因为有时在编译之后编译器会显示一些例如数据转换之类的警告,这些警告是我们平时可以忽略的。

-Wall选项意思是编译后显示所有警告。

-W选项类似-Wall,会显示警告,但是只显示编译器认为会出现错误的警告。

在编译一些项目的时候可以-W和-Wall选项一起使用

Werror,它要求GCC将所有的警告当成错误进行处理

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值