GCC:
1.
gcc hello.c -o hello
这是一步编译成hello这个可执行文件,其实有四个过程:预处理,编译,汇编,链接四个过程,最后才成可执行的文件;
常见的文件后缀:
.c c文件
.h .h文件
.i 预处理过的c文件
.o 编译后的目标文件
.s 汇编语言文件
#inclde< .h> 包含的.h头文件在标准库中;
#include " .h" 包含的.h 头文件在当前目录中;当前找不到会到标准库中去寻找
2. 预处理
#gcc -E hello.c -o hello.i
把#include <stdio.h>所包含的文件全部拉到了hello.i中;
3. 编译
#gcc -S hello.i -o hello.s ,生成了.s 汇编文件
4. 汇编
#gcc -c hello.s -o hello.o
对汇编文件进行汇编处理,生成目标.o文件
5. 链接
#gcc hello.o -o hello ;把hello.o目标文件和需要用到的库进行链接,生产一个可执行的文件hello
6. 生成可调式的代码-g
#gcc -g hello.c -o hello1; hello1是可以对运行过程进行调试l
7. -Wall 包含告警信息
#gcc -Wall hello.c -o hello ; 编译过程把告警信息打印出来
8. -w 不包含告警信息
#gcc -w hello.c -o hello
9. -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
例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。
makefile的编写
首先是子目录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
附:根目录main函数下的makefile的内容