c语言编译流程和库的制作
gcc 的编译流程
1、预处理
1)、宏定义展开
2)、头文件展开
3)、删除注释
4)、条件编译
格式:gcc -E a.c -o a.i
2、编译
1)、检查语法
2)、转化成汇编语言
格式:gcc -S a.i -o a.s
3、汇编
1)、将汇编语言转化成机器语言
格式:gcc -c a.s -o a.o
4、链接
1)、将库文件链接变成可执行文件
格式:gcc a.o -o a.exe
库制作准备
代码内容
[root@localhost libsrc]# cat *.c
//
// Created by lenovo on 2021/12/22.
//
#include "m.h"
int add(int a,int b){
return a+b;
}
//
// Created by lenovo on 2021/12/22.
//
#include "m.h"
int del(int a,int b){
return a-b;
}
//
// Created by lenovo on 2021/12/22.
//
#include "m.h"
int divde(int a,int b){
return a/b;
}
//
// Created by lenovo on 2021/12/22.
//
#include "m.h"
int mul(int a,int b){
return a*b;
}
[root@localhost libsrc]# cat ../src/main.c
#include <stdio.h>
#include "m.h"
int main() {
int c = add(1,2);
printf("Hello, World! %d\n",c);
return 0;
}
不通目录间程序的编译
gcc main.c ../libsrc/*.c -I ../head/ #不同目录程序间的编译
./a.out #测试效果
静态库
静态库的制作
1.将静态库源码编译成文二进制文件
cd libsrc/
gcc -c *.c -I ../head/
2.将二进制输出文件进行打包
ar crs libcalc.a *.o
#把新城生的库文件导入到lib目录下
cp libcalc.a ../lib/
3.查看静态类库的结构(非必须)
nm libcalc.a
静态库的使用
cd ../src/
gcc main.c -o static_main -I ../head/ -L ../lib -lcalc
./static_main
动态库
动态库的制作
1.将动态库源码编译成文二进制文件
cd ../sharedLibsrc/
gcc -c -fPIC *.c -I ../head/
2.将二进制输出文件制作动态库
gcc -o libcalc.so -shared *.o
mv libcalc.so ../sharedLib
动态库的使用
客户端程序 编译(动态库的编译)
cd ../src/
gcc main.c -o shared_main -I ../head/ -L ../sharedLib -lcalc
执行测试失败 打印动态依赖库发现找不我们的动态库。
处理办法
1.将动态库做链接放到系统/lib下
ln -s /root/test/sharedLib/libcalc.so /lib/libcalc.so
ldconfig #configure dynamic linker run-time bindings
2.将动态库链接路径放到动态链接库中
echo "/root/test/sharedLib" >> /etc/ld.so.conf
ldconfig #configure dynamic linker run-time bindings
3.配置动态链接库的库地址
export LD_LIBRARY_PATH=/root/test/sharedLib/:$LD_LIBRARY_PATH