四个阶段:
- 预处理, 展开头文件/宏替换/去掉注释/条件编译 (cc.i cc.i)
- 编译, 检查语法,生成汇编 (cc.s cc.s)
- 汇编, 汇编代码转换机器码 (cc.o cc.o)
- 链接 链接到一起生成可执行程序 a.out
引用其他文件函数生成可执行文件过程:
cc.h 文件:
#if !defined(_CC_H_)
#define _CC_H_
int aa;
char* printchar();
#endif // _CC_H_
cc.c 文件:
#include <stdio.h>
int aa = 9;
char* printchar() {
printf("print cahr");
return "ret prin char";
}
main.c 文件:
#include <stdio.h>
#include "cc.h"
int main(){
printf("ddd:%d\n",aa);
char *s = printchar();
// printf("ss:%s\n",s);
// return 0;
}
生成cc.c目标文件 gcc -c cc.c 会生成 cc.o 即目标文件。运行gcc -o main main.c cc.o && ./main
生成静态库文件 ar -cvr -o libcc.a cc.c 生成libcc.a。运行 gcc -o main main.c libcc.a && ./main
生成动态库文件gcc -fPIC -shared -o libcc.so cc.c 生成libcc.so。
使用动态库gcc -o main main.c -L/xxx/…(libcc.so所在目录)… -lcc -Wl,-rpath=/xxx/…(libcc.so所在目录)…
指令说明:
-L[dir] 指定库文件所在目录。默认搜索目录/usr/lib /lib
-l[name] 旗标是小写L。指定使用库文件名称。库文件名称格式需要是lib$(name).so
-Wl, 后方字符串选项使用逗号(,)分割
-rpath 程序运行时加入库的目录地址。注:只加入-L不加-rpath能链接库生成执行文件,但是执行时就会找不到库文件。问题报错:error while loading shared libraries: libxx.so: cannot open shared object file: No such file or directory
-I 旗标是大写i。指定头文件目录。
如不使用-L与-rpath,可把库放入/usr/lib或者/lib中。