lliinnuuxx

来源:互联网 发布:汉客拉杆箱怎么样知乎 编辑:程序博客网 时间:2024/05/16 17:31

0,http://my.oschina.net/kimiz/blog/168610

 

1,obj-y,obj-m

obj-y:把由foo.c 或者 foo.s 文件编译得到foo.o 并连接进内核.
obj-m: 则表示该文件作为模块编译.
除了y、m以外的obj-x 形式的目标都不会被编译。

除了obj-形式的目标以外,还有lib-y library 库、hostprogs-y 主机程序。

hello-objs := file1.o file2.o ......  多文件时,用这种形式

2,KERNELDIR这句是对KERNELDIR进行赋值,这个变量是后面我们用到的指代内核源码目录用的。

pwd(print working directory)命令显示整个路径名

3,$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
1),-C $(KERNELDIR)
表示在$(KERNELDIR)目录下执行make命令。

2),M=$(PWD)
表示包含$(PWD)下的Makefile文件。

3),modules
表示模块编译

 

4,$(MAKE) -C $(KERNELDIR) M=$(PWD)

 

 

-C是表示进入$(KERNELDIR)目录执行makefile

而M不是Makefile的选项,是内核根目录下的Makefile中使用的变量

 

 

5,INCS  ,  OPTLVL

   INCS定义了依赖的包含文件路径。

 

6,

Makefile选项CFLAGS,LDFLAGS,LIBS

CFLAGS 表示用于 C 编译器的选项,

CXXFLAGS 表示用于 C++ 编译器的选项。
这两个变量实际上涵盖了编译和汇编两个步骤。

CFLAGS: 指定头文件(.h文件)的路径,如:CFLAGS=-I/usr/include -I/path/include。同样地,安装一个包时会在安装路径下建立一个include目录,当安装过程中出现问题时,试着把以前安装的包的include目录加入到该变量中来。

LDFLAGS:gcc 等编译器会用到的一些优化参数,也可以在里面指定库文件的位置。用法:LDFLAGS=-L/usr/lib -L/path/to/your/lib。每安装一个包都几乎一定的会在安装目录里建立一个lib目录。如果明明安装了某个包,而安装另一个包时,它愣是说找不到,可以抒那个包的lib路径加入的LDFALGS中试一下。

LIBS:告诉链接器要链接哪些库文件,如LIBS = -lpthread -liconv

简单地说,LDFLAGS是告诉链接器从哪里寻找库文件,而LIBS是告诉链接器要链接哪些库文件。不过使用时链接阶段这两个参数都会加上,所以你即使将这两个的值互换,也没有问题。

有时候LDFLAGS指定-L虽然能让链接器找到库进行链接,但是运行时链接器却找不到这个库,如果要让软件运行时库文件的路径也得到扩展,那么我们需要增加这两个库给"-Wl,R":

LDFLAGS = -L/var/xxx/lib -L/opt/mysql/lib -Wl,R/var/xxx/lib -Wl,R/opt/mysql/lib

如果在执行./configure以前设置环境变量export LDFLAGS="-L/var/xxx/lib -L/opt/mysql/lib -Wl,R/var/xxx/lib -Wl,R/opt/mysql/lib" ,注意设置环境变量等号两边不可以有空格,而且要加上引号(shell的用法)。那么执行configure以后,Makefile将会设置这个选项,链接时会有这个参数,编译出来的可执行程序的库文件搜索路径就得到扩展了。





7,INCS定义了依赖的包含文件路径。


我们用gcc编译程序时,可能会用到“-I”(大写i),“-L”(大写l),“-l”(小写l)等参数,下面做个记录:


例:

gcc -o hello hello.c -I /home/hello/include -L /home/hello/lib -lworld


上面这句表示在编译hello.c时:

-I /home/hello/include表示将/home/hello/include目录作为第一个寻找头文件的目录,寻找的顺序是:/home/hello/include-->/usr/include-->/usr/local/include


-L /home/hello/lib表示将/home/hello/lib目录作为第一个寻找库文件的目录,寻找的顺序是:/home/hello/lib-->/lib-->/usr/lib-->/usr/local/lib


 -lworld表示在上面的lib的路径中寻找libworld.so动态库文件(如果gcc编译选项中加入了“-static”表示寻找libworld.a静态库文件)



8.

在makefile中定义的推导规则并不传递给被调用的NMAKE程序。.SUFFIXES和.PRECIOUS指令的设置同样是不会被继承的。
   当然您可以让.SUFFIXES、.PRECIOUS和所有的推导规则对于递归调用是有效的,通过在TOOLS.INI文件中定义他们或是将其定义在一个文件中然后在每个NMAKE会话中用!INCLUDE指令包含该命令。
   
     例子
   MAKE宏在生成一个程序的不同版本时是有用的。下面的makefile递归调用NMAKE来在目录/vers1和/vers2中生成目标。

 

NMAKE

 

http://blog.csdn.net/sunshineboyleng/article/details/5028929


 

http://www.cnblogs.com/itech/archive/2009/09/15/1567088.html

 

 

9,

在Makefile规则中,通配符会被自动展开。但在变量的定义和函数引用时,通配符将失效这种情况下如果需要通配符有效,就需要使用函数“wildcard,它的用法是:$(wildcard PATTERN...)。在Makefile中,它被展开为已经存在的使用空格分开的匹配此模式的所有文件列表。如果不存在任何符合此模式的文件,函数会忽略模式字符并返回空。需要注意的是:这种情况下规则中通配符的展开和上一小节匹配通配符的区别。

一般我们可以使用$(wildcard *.c)”来获取工作目录下的所有的.c文件列表。复杂一些用法;可以使用“$(patsubst %.c,%.o,$(wildcard *.c))”,首先使用“wildcard”函数获取工作目录下的.c文件列表;之后将列表中所有文件名的后缀.c替换为.o。这样我们就可以得到在当前目录可生成的.o文件列表。因此在一个目录下可以使用如下内容的Makefile来将工作目录下的所有的.c文件进行编译并最后连接成为一个可执行文件:

 

 

10,wildcard:扩展通配符

         notdir:去除路径

         patsubst:替换通配符

 

 

建立一个简单的Makefile
src=$(wildcard *.c ./sub/*.c)
dir=$(notdir $(src))
obj=$(patsubst %.c,%.o,$(dir) )

all:
 @echo $(src)
 @echo $(dir)
 @echo $(obj)
 @echo "end"

 
test------------a.c  b.c2

       ------------sub
                        -------------sa.c   sb.c2

 

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

 

 

 

 

 

 


 

 


0 0