一:gcc
1.gcc hello.c -o hello
直接编译成可执行文件,其中有四个过程:预处理、编译、汇编、链接,最后生成课执行文件。
(1)预处理:gcc -E hello.c -o hello.i
把#include <stdio.h> 所包含的文件全部拉到hello.i中;
(2)编译:gcc -S hello.i -o hello.s
生成汇编文件;
(3)汇编:gcc -c hello.s -o hello.o
对文件进行汇编处理,生成目标文件.o;
(4) 链接:gcc hello.o -o hello
把hello.o目标文件和需要用到库进行链接,生成一个可执行的文件。
常见的文件后缀:
.c c文件
.h .h文件
.i 预处理过的c文件
.o 编译后的目标文件
.s 汇编语言文件
#include < .h> 包含的头文件在标准库中
#include " .h" 包含的头文件在当前目录中,当前找不到会到标准库中查找。
2.生成可调试代码-g
#gcc -g hello.c -o hello hello是可以对运行过程进行调试。
3.-Wall 包含告警信息
#gcc -Wall hello.c -o hello
编译过程把告警信息打印出来
4.-w 不包含告警信息
#gcc -w hello.c -o hello
5.-I ./w1 寻找当前w1文件夹下的头文件
hello.c
#include "hello.h"
int main()
{
printf("hello\n");
return 0;
}
hello.h 在./w1下
#include <stdio.h>
编译时:
#gcc -I ./w1 hello.c -o hello
自动到w1中寻找hello.h
二.Makefile
1.
目标:依赖文件
<tab> 可执行命令
2.
例1:
hello: hello.c
gcc hello.c -o hello
.PHONY:clean
clean:
rm -rf hello
3.
例2:Makefile
hello: main.o func1.o func2.o func3.o
gcc main.o func1.o func2.o -o hello
main.o:main.c
gcc -c main.c
func1.o:func1.c
gcc -c func1.c
func2.o: func2.c
gcc -c fun2.c
func3.o:func3.c
gcc -c func3.c
clean:
rm -rf main.o func1.o func2.o func3.o
makefile1
#make -f makefile1
Makfile 可以修改如下:
obj=main.o func1.o func2.o func3.o
hello:$(obj)
gcc $(obj) -o hello
.......
4. 变量
$^:代表所有的依赖文件
$@: 代表目标
$<: 第一个依赖文件
例:
hello:main.o func1.o func2.o
gcc $^ -o $@
4. $(MAKE) -C subdir 改变makefile的路径的
top dir(根目录)下有源文件main.c、makefile(主)、文件夹sub1、文件夹sub2;子目录sub1里有源
文件sub1.c和makefile(次1);子目录sub2里有源文件sub2.c和makefile(次2)。
main.c里有主函数,需要调用sub1.c里的和sub2.c。
要求通过根目录下的makefile嵌套调用子目录下的makefile来编译,最后链接生成可执行文件edit。
首先是子目录sub1下的makefile:
sub1.o : sub1.c
gcc-c sub1.c
接下来是子目录sub2下的makefile:
sub2.o : sub2.c
gcc -csub2.c
最后是根目录下的makefile:
VPATH=./sub1 ./sub2
obj=main.o sub1.o sub2.o
edit : $(obj)
gcc -o edit main.o ./sub1/sub1.o ./sub2/sub2.o
main.o : main.c
gcc -cmain.c
sub1.o : sub1.c
$(MAKE) -C ./sub1
sub2.o : sub2.c
$(MAKE) -C./sub2
.PHONY : clean
clean :
rm editmain.o -fr
rm./sub1/*.o -fr
rm./sub2/*.o -fr