Linux —— 静态库和动态库使用 gcc 或 CMake 的生成

提示:gcc 可以帮助我们理解库的原理,CMake 可以帮助我们更简单的生成库


前言

本文记录静态链接库和动态链接的生成及使用,分别使用 gcc 和 CMake 两种工具进行生成,并探讨一些细节。
举例一个简单的项目作为介绍的样本,目录中存在 main.c(主文件),lib_bro.c(准备生成静态的库源文件),lib_ext.c(准备生成动态库的源文件),以及对应的头文件,文档旨在描述库的生成及使用过程。

1. 静态库的简介

静态库是什么,抛开各种书本的定义,静态库就是使用编译器(比如 gcc)编译成的目标文件,再经过打包操作(ar)形成的代码库(不能含有 main 函数实现),用于和 main 目标文件合并在一起,进一步形成可执行文件,可执行文件内包含静态库的代码。

2. 动态库的简介

动态链接库则是使用编译器(比如 gcc)编译成目标文件,再进一步使用编译器(gcc)生成的需要其他程序调用的应用(不能含有 main 函数实现),在与 main 目标文件链接时,仅把位置链接进去,可执行文件内不含动态库的代码。
使用 file 工具查看时,会发现动态库的描述更接近于可执行程序。

一、gcc 工具下库的生成及使用

1. 静态库的生成

静态库的生成比较简单,使用 gcc 正常编译完目标文件后,再用 ar 工具打包为静态库即可

// 正常生成静态库
gcc -c lib_bro.c -o lib_bro.o
// 使用 ar 工具进行打包,库名为 src
ar -r libsrc.a lib_bro.o

2. 静态库的使用

这里我们使用 gcc 将静态库链接至可执行程序,生成可执行程序时,静态库中的内容会被复制到程序中,生成完成后程序将会独立运行,运行过程中不再需要静态链接库的支持。所以生成后,静态链接库也就没有用了。

// -L. 参数指明要加载的静态库路径为当前路径,如果静态库不是当前路径则需要描述相对路径
// 如果把生成的库拷贝至系统指定路径(比如:/lib),编译器直接可用找到就不需要加 -L 参数了
// -lsrc 参数指明将要链接的库名为 src
gcc main.c -L. -lsrc -o demo.out

采用静态链接库生成可执行程序后,使用 ldd 工具查看是找不到程序对原有库 src 依赖关系的

3. 动态库的生成

使用 gcc 生成动态链接库的相关命令如下:

// 先将源码编译成为目标文件,-fPIC 参数意味着编译出的目标文件与位置无关
// 如果源码文件内只有一个函数接口,那么 -fPIC 不用也可以,此外与正常的编译目标文件命令一致
// gcc -c -fPIC *.c -o *.o
gcc -c -fPIC lib_ext.c -o lib_ext.o
// 生成动态库的只需要 gcc 参数跟上 -shared 即可
// 这里我们将外部目录中的代码编译为动态库,注意库名实际为 ext
gcc -shared -o libext.so *.o

4. 动态库的使用

同样使用 gcc 将动态链接库链接至可执行程序,生成可执行程序时,只有动态库的名称会被复制到程序中,源码并不会被复制,生成后的程序在执行时,才会要求将动态库加载至内存执行。

// 库的链接方面,静态库和动态库都是一样的
// 如果把生成的库拷贝至系统指定路径(比如:/lib),编译器直接可用找到就不需要加 -L 参数了
gcc main.c -L. lext -o demo.out

采用动态链接库生成可执行程序后,使用 ldd 工具查看,将会发现程序对 ext 库名存在依赖关系。
生成程序后,别忘了将前面生成的库复制到系统目录下(比如:/lib),程序才能正常运行

二、CMake 工具下库的生成及使用

CMake 工具下库的生成不管是静态的还是动态的,使用的函数是一样的,只是参数的区别,

// 生成一个静态库 STATIC 指明静态库
add_library(src STATIC lib_bro.c)
// 生成一个动态库 SHARED 指明动态库
add_library(ext SHARED lib_ext.c)
// 将静态库链接至程序
target_link_libraries(demo src)
// 将动态库链接至程序
target_link_libraries(demo ext)

CMake 工具内,程序执行前需要将动态库复制到系统目录下的话,可用用 install 函数,其目的也是将库复制到系统目录


总结

CMake 确实省事,用 gcc 生成库的原理了解一下就好了。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值