linux 下C语言编程库文件处理与Makefile编写

简介: 做开发快3年了,在linux下编译安装软件算是家常便饭了。就拿gcc来说,都有不下10次了,可基本每次都会碰到些奇奇怪怪的问题。看来还是像vs、codeblocks这样的ide把人弄蠢了。便下定决心一定要好好学习下如何在linux下纯手工gcc编译c项目。

做开发快3年了,在linux下编译安装软件算是家常便饭了。就拿gcc来说,都有不下10次了,可基本每次都会碰到些奇奇怪怪的问题。看来还是像vs、codeblocks这样的ide把人弄蠢了。便下定决心一定要好好学习下如何在linux下纯手工gcc编译c项目。今天学了2点,一个是库文件处理,另一个是makefile编写。

学习的系统是centos6.6,编译升级的gcc4.8.2,明天写个博客总结下这回gcc安装的过程,每次都能学到些东西。

gcc的编译过程

首先需要清楚gcc编译做了些什么

源文件----预处理---->预处理文件(*.i)----编译---->汇编文件(*.s)----汇编编译---->目标文件(*.o)----链接---->可执行文件

基本与windows下的类似。通过给gcc加一些选项,可以控制编译工作进行到指定的阶段,下面试常用的一些gcc编译选项

  • -c 编译,汇编源文件,不链接,得到*.o文件
  • -S 只编译,不汇编,得到*.s文件
  • -E 预处理文件,得到*.E文件
  • -o [dis] [src] 将src文件编译成可执行文件dis
  • -Idir 指定include包含文件搜索路径
  • -g 生成具有调试信息,如果不加这个选项,*.o文件中不会生成.debug段,在调试时将不能查看打印变量值

学习过c和c++的都知道,c或c++程序存在各种各样的库文件,就是已经编译好的包含数据和执行代码的二进制文件。windows就是dll文件,linux下有.a和.so文件。如果需要使用这些库文件,在ide环境下勾个选项就把事给办了,在手工编译的情况下就麻烦了点。

gcc创建和使用静态库

编写static_lib.c文件

创建静态库

1 gcc -c static_lib.c
2 ar rcs static_lib.a static_lib.o

上面的命令会在当前目录下生产 static_lib.a 静态库文件

使用链接静态库

编写 static_lib.h文件

编写main3.c文件,使用静态库中的方法

编译main3.c并链接静态库文件

执行

1 gcc main3.c -lstatic_lib.a -o app3

但却出现链接器ld找不到库的问题,把-l参数去掉就正常了

1 gcc main3.c static_lib.a -o app3

最后会生成可执行文件app3。静态库的特点是将库里的代码放到了执行文件里,如果修改了静态库的代码,要重新编译依赖它执行文件才能升级

gcc创建和使用动态库

动态库就是在有执行文件需要使用这个库时,动态加载到执行的库文件。

编写share_lib.c文件

创建动态库

因为需要与位置无关,所以需要使用-fPIC选项,gcc的选项有上千个,需要查询某个选项可以man gcc然后查找查看

1 gcc -shared -fPIC -o share_lib.so share_lib.c

生成的share_lib.so文件就是动态库文件,在使用这个库的程序使用时被动态加载,并没有被写入到别的执行文件中,所以当库文件修改,不需要去重新编译其他使用这个库的程序

使用动态库

share_lib.h文件声明函数

编写main4.c文件,include "share_lib.h" 文件

编译main4.c并链接动态库

1 gcc main4.c ./share_lib.so -o app4

生成的app4就是可执行文件.

编写makefile编译

将前面静态库的3个源文件main3.c,static_lib.c,static_lib.h放到一个目录下。

编写Makefile文件。

其中冒号左边表示目标文件或者命令,命令也叫伪目标。

执行make

执行make clean可以清除编译产生的文件

当然,这恐怕是最简单的makefile了,Makefile还有很多学的,我也在学习中,以后有收获会继续写博客记录,争取以后看大神写的makefile不要在略懂略懂了

 

目录
相关文章
|
12天前
|
Linux
【Linux系统编程】基础指令(二)(下)
【Linux系统编程】基础指令(二)
|
1天前
|
存储 Shell Linux
操作系统实战(一)(linux+C语言)
本篇文章重点在于利用linux系统的完成操作系统的实验,巩固课堂知识
|
4天前
|
存储 算法 网络协议
【探索Linux】P.26(网络编程套接字基本概念—— socket编程接口 | socket编程接口相关函数详细介绍 )
【探索Linux】P.26(网络编程套接字基本概念—— socket编程接口 | socket编程接口相关函数详细介绍 )
12 0
|
4天前
|
Shell Linux 编译器
C语言,Linux,静态库编写方法,makefile与shell脚本的关系。
总结:C语言在Linux上编写静态库时,通常会使用Makefile来管理编译和链接过程,以及Shell脚本来自动化构建任务。Makefile包含了编译规则和链接信息,而Shell脚本可以调用Makefile以及其他构建工具来构建项目。这种组合可以大大简化编译和构建过程,使代码更易于维护和分发。
21 5
|
5天前
|
数据可视化 小程序 Linux
【Linux】自动化构建工具make/Makefile和git介绍
【Linux】自动化构建工具make/Makefile和git介绍
13 0
|
5天前
|
Shell Linux 编译器
C语言,Linux,静态库编写方法,makefile与shell脚本的关系。
总结:C语言在Linux上编写静态库时,通常会使用Makefile来管理编译和链接过程,以及Shell脚本来自动化构建任务。Makefile包含了编译规则和链接信息,而Shell脚本可以调用Makefile以及其他构建工具来构建项目。这种组合可以大大简化编译和构建过程,使代码更易于维护和分发。
13 3
|
11天前
|
Linux
Linux课程四课---Linux开发环境的使用(自动化构建工具-make/Makefile的相关)
Linux课程四课---Linux开发环境的使用(自动化构建工具-make/Makefile的相关)
|
12天前
|
存储 Unix Linux
【Linux系统编程】基础指令(三)
【Linux系统编程】基础指令(三)
|
3月前
|
Linux 调度 数据库
Linux下的系统编程——线程同步(十三)
Linux下的系统编程——线程同步(十三)
54 0
Linux下的系统编程——线程同步(十三)
|
7月前
|
存储 Linux 调度
Linux系统编程 多线程基础
Linux系统编程 多线程基础
30 0