C代码的编译器(gcc),多文件编译


一、写一个hello word!

点击查看代码
#include    //包含头文件(printf的头文件)

//<>          表示stdio.h在系统的/usr/include路径下
//""          表示当前目录
//#include    包含头文件的固定用法

int  main(int arg,const char *a)            //main 是C代码的入口函数,后面是参数
{
    printf("hellow word!\n");               //printf 是打印语句
    return 0;                               //代表函数的返回值(返回0,代表代码执行成功   返回 -1,代表代码执行失败  ),返回值返回给了操作系统。
}

?注:使用C语言编写的是源文件,它是不能够直接执行的。原因是机器只能识别0和1的二进制
??? 源文件-------->编译------->二进制文件(可执行文件)

?编译:
???gcc ??XXXX.c?? -o ??helloworld

?执行:
??? ./helloworld

二、gcc编译器:

?$gcc ? -v ??: 查看gcc的版本
??gcc编译的代码只能够在Ubuntu(X86)上执行,不能在手机上执行,因为手机是(arm架构的);

点击查看代码
ubuntu@linux:~/test$file hello 
hello: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0, BuildID[sha1]=90f99701f6d9ff5de84733f54d9892846930b7e0, not stripped
?我们在编译时,其实在其内部已经执行了:

???预处理:对头文件,宏定义进行替换,对条件编译进行替换(预处理不会对语法进行检查,所以此阶段不占用程序运行时间)

???????gcc??-E??xxx.c??-o??helloworld.i

???编译:对语法进行检查(对变量的赋值语法等),将预处理后的文件编译成汇编文件。

???????gcc??-S??helloworld.i??-o ??helloworld.s

???汇编:将汇编文件编译成二进制文件,但是这个文件没有链接库,所以他是无法执行的。

??????libc.a 静态库 :在编译的时候,直接将所依赖的所有内容编译到可执行程序中。
??????libc.so 动态库 :在编译的时候只是将符号链接编译进去,执行的时候会反过来找这个库。

???????gcc??-c??helloworld.s??-o??helloworld.o

???链接:将依赖的库链接到可执行程序( .out )中.

???????gcc??helloworld.o??-o??helloworld

???????如果有多个文件:gcc?a.o?b.o?c.o??-o??helloworld

???????也可一步完成
???????编译:
????????gcc ??xxx.c?? -o ??helloworld
???????执行:
???????? ./helloworld

???????或者
???????编译:
????????gcc??xxx.c
???????执行:
????????./a.out

三、C代码多文件的编程

??一个工程文件中包含多个.c文件,每个.c文件中包含多个.h文件。
??多文件编程中一个 .c文件应该对应一个.h文件 ,main函数的那个.c文件除外,并且只能有一个main函数
?
?????├── add.c
?????├── add.h
?????├── main.c
?????├── sub.c
?????└── sub.h

??防止头文件重复包含的机制:

点击查看代码
#ifndef 宏定义名
#define 宏定义名
//包含其他的头文件
//函数的声明
//变量的声明
//数据类型的定义。
//宏定义
#endif

???这里宏定义名一般默认为 :文件名_H
???宏定义的名字字母一般都是大写

编译:
    预处理,编译,汇编:
    gcc -c main.c -o main.o
    gcc -c add.c -o add.o
    gcc -c sub.c -o sub.o
    链接:
    gcc main.o add.o sub.o -o demo