linux驱动学习(一) Makefile基础
2011-10-12 14:18
253 查看
“大计划”需要,现要全面学习linux驱动。记录下完整的学习过程,方便日后需要。
linux与windows 的C编程差异之一就是Makefile,对于学习C语言来说,起初最好是在linux环境下。
一般的程序都是由多个源文件编译链接而成,除了极其简单的hello word,这些源文件的处理步骤通常用Makefile来管理。Makefile有什么作用呢,先编写一个简单的程序。
程序有三个源文件main.c hello.c word.c 以及各自的头文件main.h hello.h word.h组成
在没有Makefile的情况下可以这样编译
但是,其中的一个源文件如hello.c改动了,这些源文件都得重新编译,所以可以改成这样编译
如果修改了hello.c 只要重新执行
这样虽然简化了程序的编译,但是每次都得重新输入命令,效率低,而且很容易出错,所以Makefile就是来解决上列问题,但不止于此。
将Makefile与源代码放在同一目录下
make后,在终端打印了执行的命令
make命令会自动读取当前目录下的Makefile
<localhost.localdomain:/data/ghostyu/linuxc> make
gcc -c main.c
gcc -c hello.c
gcc -c word.c
gcc main.o hello.o word.o -o main
<localhost.localdomain:/data/ghostyu/linuxc>
这样每次修改源文件后 只要make 下就可以了!
Makefile的编写规规则为一个或多个下列命令组构成:
target ... : prerequisites ...
cmd1
cmd2
...
如:
main: main.o hello.o word.o
gcc main.o hello.o word.o -o main
main为规则的目标(target),main.o hello.o word.o 为这条规则的条件(prerequisites)
要更新目标,必须先更新所有条件,若条件被更新,目标必备更新,更新的依据为文件的修改时间。
所以上列Makefile中,会先执行
main.o: main.c main.h hello.h word.h
gcc -c main.c
hello.o: hello.c hello.h
gcc -c hello.c
word.o: word.c word.h
gcc -c word.c
而后才链接目标main
main: main.o hello.o word.o
gcc main.o hello.o word.o -o main
通常Makefile中会有一条clean规则,用于清除编译过程中产生的二进制文件,保留源文件
在Makefile中加入clean
clean:
@echo "cleanning project"
-rm main *.o
@echo "clean completed"
命令rm前加了‘-’号,表示即使make执行这条命令出错了,也会继续运行,像rm,mkdir等一般会加上‘-’,因为rm的文件可能已经被删除,或者mkdir的目录已经存在。
<localhost.localdomain:/data/ghostyu/linuxc> make clean
cleanning project
rm main *.o
clean completed
<localhost.localdomain:/data/ghostyu/linuxc>
大家试试吧echo前的@符号去掉试试,结果如下
<localhost.localdomain:/data/ghostyu/linuxc> make clean
echo "cleanning project"
cleanning project
rm main *.o
echo "clean completed"
clean completed
<localhost.localdomain:/data/ghostyu/linuxc>
如果make执行的命令前面加了@字符,则不显示命令本身而只显示它的结果。
假如源文件中有个叫clean.c的源文件,然后make的时候就直接 make到这个clean源文件了,所以Makefile中的clean部分要特殊说明下,将clean声明为一个伪目标:
clean:
@echo "cleanning project"
-rm main *.o
@echo "clean completed"
.PHONY: clean
clean目标是一个约定俗成的名字,类似这样约定成俗的名字还有:
install,执行编译后的安装工作,把可执行文件、配置文件、文档等分别拷到不同的安装目录。
clean,删除编译生成的二进制文件。
distclean,不仅删除编译生成的二进制文件,也删除其它生成的文件,例如配置文件和格式转换后的文档,执行make distclean之后应该清除所有这些文件,只留下源文件。
注,Makefile文件名也可以是小写的makefile,执行make时,按照 makefile,Makefile的顺序找到的第一个为默认的Makefile。
linux与windows 的C编程差异之一就是Makefile,对于学习C语言来说,起初最好是在linux环境下。
一般的程序都是由多个源文件编译链接而成,除了极其简单的hello word,这些源文件的处理步骤通常用Makefile来管理。Makefile有什么作用呢,先编写一个简单的程序。
程序有三个源文件main.c hello.c word.c 以及各自的头文件main.h hello.h word.h组成
//main.c
#include"main.h" #include"hello.h" #include"word.h" void main_say() { printf("I am main!\n"); } int main(void) { main_say(); hello_say(); word_say(); }
//main.h
#ifndef MAIN_H #define MAIN_H void main_say(); #endif
//hello.c
#include"hello.h" void hello_say() { printf("I am hello!\n"); }
//hello.h
#ifndef HELLO_H #define HELLO_H extern void hello_say(); #endif
//word.c
#include"word.h" void word_say() { printf("I am word!\n"); }
//word.h
#ifndef WORD_H #define WORD_H extern void word_say(); #endif
在没有Makefile的情况下可以这样编译
gcc main.c hello.c word.c -o main
但是,其中的一个源文件如hello.c改动了,这些源文件都得重新编译,所以可以改成这样编译
$gcc -c main.c $gcc -c hello.c $gcc -c word.c $gcc main.o hello.o word.o -o main
如果修改了hello.c 只要重新执行
$gcc -c hello.c $gcc main.o hello.o word.o -o main
这样虽然简化了程序的编译,但是每次都得重新输入命令,效率低,而且很容易出错,所以Makefile就是来解决上列问题,但不止于此。
将Makefile与源代码放在同一目录下
main: main.o hello.o word.o gcc main.o hello.o word.o -o main main.o: main.c main.h hello.h word.h gcc -c main.c hello.o: hello.c hello.h gcc -c hello.c word.o: word.c word.h gcc -c word.c
make后,在终端打印了执行的命令
make命令会自动读取当前目录下的Makefile
<localhost.localdomain:/data/ghostyu/linuxc> make
gcc -c main.c
gcc -c hello.c
gcc -c word.c
gcc main.o hello.o word.o -o main
<localhost.localdomain:/data/ghostyu/linuxc>
这样每次修改源文件后 只要make 下就可以了!
Makefile的编写规规则为一个或多个下列命令组构成:
target ... : prerequisites ...
cmd1
cmd2
...
如:
main: main.o hello.o word.o
gcc main.o hello.o word.o -o main
main为规则的目标(target),main.o hello.o word.o 为这条规则的条件(prerequisites)
要更新目标,必须先更新所有条件,若条件被更新,目标必备更新,更新的依据为文件的修改时间。
所以上列Makefile中,会先执行
main.o: main.c main.h hello.h word.h
gcc -c main.c
hello.o: hello.c hello.h
gcc -c hello.c
word.o: word.c word.h
gcc -c word.c
而后才链接目标main
main: main.o hello.o word.o
gcc main.o hello.o word.o -o main
通常Makefile中会有一条clean规则,用于清除编译过程中产生的二进制文件,保留源文件
在Makefile中加入clean
clean:
@echo "cleanning project"
-rm main *.o
@echo "clean completed"
命令rm前加了‘-’号,表示即使make执行这条命令出错了,也会继续运行,像rm,mkdir等一般会加上‘-’,因为rm的文件可能已经被删除,或者mkdir的目录已经存在。
<localhost.localdomain:/data/ghostyu/linuxc> make clean
cleanning project
rm main *.o
clean completed
<localhost.localdomain:/data/ghostyu/linuxc>
大家试试吧echo前的@符号去掉试试,结果如下
<localhost.localdomain:/data/ghostyu/linuxc> make clean
echo "cleanning project"
cleanning project
rm main *.o
echo "clean completed"
clean completed
<localhost.localdomain:/data/ghostyu/linuxc>
如果make执行的命令前面加了@字符,则不显示命令本身而只显示它的结果。
假如源文件中有个叫clean.c的源文件,然后make的时候就直接 make到这个clean源文件了,所以Makefile中的clean部分要特殊说明下,将clean声明为一个伪目标:
clean:
@echo "cleanning project"
-rm main *.o
@echo "clean completed"
.PHONY: clean
clean目标是一个约定俗成的名字,类似这样约定成俗的名字还有:
install,执行编译后的安装工作,把可执行文件、配置文件、文档等分别拷到不同的安装目录。
clean,删除编译生成的二进制文件。
distclean,不仅删除编译生成的二进制文件,也删除其它生成的文件,例如配置文件和格式转换后的文档,执行make distclean之后应该清除所有这些文件,只留下源文件。
注,Makefile文件名也可以是小写的makefile,执行make时,按照 makefile,Makefile的顺序找到的第一个为默认的Makefile。
相关文章推荐
- linux驱动学习(一) Makefile基础
- linux驱动学习--第三天:驱动设计的硬件基础
- linux驱动学习(二) Makefile高级
- linux学习笔记-读《Linux设备驱动开发详解》~第二章 驱动设计的硬件基础
- linux驱动学习(三) helloword 和 驱动Makefile
- Linux设备驱动模型学习之基础中的基础篇
- linux驱动基础开发3——linux 内核配置机制(make menuconfig、Kconfig、makefile)讲解
- linux驱动基础开发3——linux 内核配置机制(make menuconfig、Kconfig、makefile)讲解-转
- Makefile学习笔记3:Linux下makefile基础 (zz)
- linux驱动基础开发3——linux 内核配置机制(make menuconfig、Kconfig、makefile)讲解
- Linux学习二:Makefile基础
- linux 学习- 编程基础之makefile
- linux网络设备应用与驱动编程学习笔记(2)——网络驱动基础
- 学习嵌入式Linux系统开发基础 第七课(makefile)
- Linux设备驱动模型学习之基础中的基础篇
- linux驱动学习(二) Makefile高级【转】
- linux驱动学习(二) Makefile高级
- 学习嵌入式Linux系统开发基础 第七课(makefile)
- 一步一步学习 Linux 驱动之(Kconfig、Makefile)
- 【加入自己的部分内容】Linux设备驱动模型学习之基础篇--Kobject.txt翻译