Makefile第三课:C语言的编译

C语言的编译

前言

学习杜老师推荐的Makefile教程视频,链接。记录下个人学习笔记,仅供自己参考。

之前有转载过杜老师的从零Makefile落地算法大项目文章,感兴趣的可以看看。

本课程主要讲解通过gcc实现C语言的编译过程以及静态库和动态库文件的生成。

1.Fundamental Compiling

编译C语言相关的后缀如下

在这里插入图片描述

2.Comiling C

2.1 Preprocessing

# 不会生成 .i 文件
gcc -E main.c
gcc -E main.c -o helloworld.i
  • -E 选项告诉编译器只进行预处理操作
  • -o 选项把预处理的结果输出到指定文件

2.2 Generating Assembly Language

gcc -S main.c
gcc -S main.c -o xxx.s
  • -S 选项告诉编译器,进行预处理和编译成汇编语言操作

每个平台对应的汇编语言的形式是不同的,例如有很多型号的开发板,有很多型号的 CPU

2.3 Source File to Object File

gcc -c main.c
gcc -c main.c -o xxx.o
# 编译多个 .c 文件
gcc -c main.c add.c minus.c

2.4 Single Source to Executable

  • 注意:后面三个命令执行后并没有按汇编过程出现 .i .s 或 .o 文件,并不意味着没有经历这些过程
gcc main.c
gcc main.c -o xxx

执行程序

./可执行程序

2.5 Multiple Sources to Executable

gcc main.c add.c minus.c -o exec
./exec

3.Creating a Static Library

  • 编译成 .o 的文件

    gcc -c [.c] -o [自定义文件名] 
    gcc -c [.c] [.c] ...
    
  • 编译静态库

    ar -r [lib自定义库名.a] [.o] [.o] ...
    
  • 链接成可执行文件

    gcc [.c] [.a] -o [自定义输出文件名]
    gcc [.c] -o [自定义输出文件名] -l[库名] -L[库所在路径]
    

4.Creating a Shared Library

  • 编译成 .o 文件

    gcc -c -fpic [.c/.cpp][.c/.cpp]... 
    
  • 编译动态库

    gcc -shared [.o][.o]... -o [lib自定义库名.so]
    
  • 链接成可执行文件

    gcc [.c/.cpp] -o [自定义可执行文件名]  -l[库名] -L[库路径] -Wl,-rpath=[库路径]
    

5.总体概括

5.1 编译过程

源文件.c文件->预编译成.i文件->编译成汇编语言.s->汇编成.o文件->链接成可执行文件(名字自定义,后缀没关系)

5.2 编译过程命令

  • 预处理:

    gcc -E [.c源文件] -o [自定义输出文件名.i]
    
  • 编译成汇编语言(隐藏了预处理操作) :

    gcc -S [.c源文件] 
    
  • 会变成.o的object文件(二进制文件,可用于链接) :

    gcc -c [.c源文件] [.c源文件] [...] (可选选项:-o [自定文件名])
    

5.3 库

5.3.1 静态库
  • 编库(先转成.o文件,再编成lib[自定库名].a)

    gcc -c [.c源文件] [.c源文件] [...] (可选选项:-o [自定文件名])
    
    ar -r lib[自定库名].a [.o文件] [.o文件] [...]
    
  • 链接

    gcc [main文件] -o [自定义输出可执行文件名] -l[库名] -L[库的路径]
    
5.3.2 动态库
  • 编库

    • 第一种做法, 先转成.o文件,再编成.so文件

      gcc -c -fpic [.c源文件] [.c源文件] [...]
      
      gcc -shared [.o文件] [.o文件] [...] -o lib[库名].so
      
    • 第二种做法,直接转成.so

      gcc -fpic -shared [.c源文件] [.c源文件] [...] -o lib[库名].so
      
  • 链接

    gcc [main文件] -o [自定义输出可执行文件名] -l[库名] -L[库所在路径] -Wl,-rpath=[库所在路径]
    

总结

本次课程学习了c语言文件通过gcc完整的编译过程,以及通过gcc将c语言文件编译成库文件。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱听歌的周童鞋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值