C代码的编译器(gcc),多文件编译
一、写一个hello word!
点击查看代码
#include <stdio.h> //包含头文件(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

浙公网安备 33010602011771号