gcc编译的四个阶段:预处理,编译,汇编,链接

1:gcc编译的四个阶段:预处理,编译,汇编,链接

#vi file.c

#gcc -E file.c -o file.i//-E查看且预处理后停止编译,-o生成目标文件,-i表示已预处理

#gcc -S file.i -o file.s//-S编译到汇编而不进行汇编和链接

#gcc -c file.s -o file.o//-c编译到目标代码

#gcc file.o -o file//-o 文件输出到文件

# gcc -static file.c -o file//-static禁止使用动态库

;Makefile基本规则

1 all:test

2 echo “Hello World”

3 test:

4 @echo “Hi Hi”

;用Tab键空格

;all,test是目标

;2,4是生成目标的命令

#make(默认运行1),&make all ,&make test

;Makefile 依赖关系

1 simple:main.o foo.o bar.o

2         gcc -o simple main.o foo.o bar.o//执行命令

3 main.o:main.c

4         gcc -c main.c -o main.o//生成命令

5 foo.o:foo.c

6         gcc -c foo.c -o foo.o

7 bar.o:bar.c

8         gcc -c bar.c -o bar.o

9 clean:

10         rm *.o//清楚生成的文件

;simple依赖于:main.o foo.o bar.o

;三个.o文件又依赖于三个.c文件

#touch foo.c bar.c//不写main函数,多次定义报错

#vi main.c//写上main函数

#make clean//执行10

;假目标:.PHONY

1 .PHONY:clean

2 test:

3         echo "Hello"

4 clean:

5         rm *.c

;当目录中有其他clean时,可以使用假目标不与文件关联

;#vi test.c

#gcc -c test.c

# ls

test.c  test.o(目标文件)

#gcc -o test(可执行文件) test.o

# ls

test  test.c  test.o

;一个主程序调用另一个子程序

# cat test.c test2.c

#include<stdio.h>

int main()

{printf("你好啊,我是有主啊\n");

test_2();

return 0;}

------------------------------------------

void test_2(void)

{printf("谢谢啦,你也好啊!\n");

return 0;}

# gcc -c test.c test2.c

test2.c  test2.o  test.c  test.o

# gcc -o test test.o test2.o

test  test2.c  test2.o  test.c  test.o

上一篇:ARMCC和GCC编译ARM代码的软浮点和硬浮点问题【转】


下一篇:在Ubuntu 16.04 LTS上用g++和gcc编译C/C++代码错误提示“.../x86_64-linux-gnu/crt1.o: ELF section name out of range”