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 

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值