C在编译过程分为四个阶段:
1.预处理:①:头文件展开 ②:宏替换 ③:条件编译;
头文件 cd /usr/include/
gcc -E demo.c> demo.i[-E(只进行预处理) >(重定向) .i(预处理文件后缀名)]
<stdio.h> 系统的头文件目录,找不到报错。
“stdio.h” 现在当前目录中找,找不到再去系统头文件目录中找,找不到报错。
用户自己定义的用“” 系统自带的用<>。
2.编译(进行语法检查,词法分析):gcc -c demo.c 在编译阶段停止 。
3.汇编 gcc -s demo.c 在汇编阶段停止 demo.s 汇编文件 。
4.链接 单个目标无法实现运转,必须把demo.c文件和函数库文件链接在一起才可以。
gcc hello.c -o hello or gcc -o hello hello.c 给执行文件重命名
gcc -o1 .c -o 可执行文件优化文件
-o2
-o3
gcc -w hello.c -o hello 关闭警告
gcc -Wall hello.c -o hello 开启警告
gcc 多个.c文件 -o 执行文件 编译多个文件
gcc main.c add.c -o add -I../ 指定头文件第三方搜索路径。
gcc main.c -I../ -D 外部宏定义。
/lib/ /usr/lib
库函数:保存变量和函数,可以使用变量和函数,但是看不到函数的定义和实现。
静态库(.a):是在程序执行之前就加入到执行代码中,成为执行程序的一部分执行。
1.(执行速度快)2.(编译速度慢)3.(占用内存多)4.(更新麻烦)5.(部署方便)
动态库(.so):是在执行程序启动时加载到执行代码中。
静态库
gcc -c add.c 建立库函数add.o
ar rcs libadd.a add.o
gcc main -ladd 指定库 默认路径/lib/ /usr/lib。
gcc main.c -ladd -L/root/1111 指定库路径
动态库
gcc -shared -fPIC -o libadd.so add.c
gcc main.c /root/1111/libadd.so -o add
c语言自带库:libc.a libc.so
数学库: libm.a libm.so