Makefile第三课:C语言的编译
Posted 爱听歌的周童鞋
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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语言文件编译成库文件。
以上是关于Makefile第三课:C语言的编译的主要内容,如果未能解决你的问题,请参考以下文章