IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C语言静态库和动态库实操 -> 正文阅读

[C++知识库]C语言静态库和动态库实操

C语言静态库和动态库


之前一直在看文案的解释,没有实操过,所以一直不知道到底是啥意思,直到今天恰巧搞到了一个视频,所以这里记录一下。

静态库制作与使用

制作

代码基础结构:

.
├── include
│?? └── calcute.h
├── lib
├── main.c
└── src
    ├── add.c
    └── multiple.c

3 directories, 4 files

其中:

  • calcute.h
int add(int,int);
int multiple(int,int);
  • add.c
#include "calcute.h"

int add(int a,int b){
    return a+b;
}
  • multiple.c
#include "calcute.h"

int multile(int a,int b){
    return a*b;
}
  • main.c
#include <stdio.h>
#include "calcute.h"

int main(int argc, char const *argv[])
{
    printf("2+3=%d\n",add(2,3));
    printf("2*3=%d\n",multiple(2,3));
    return 0;
}

下面就是具体的步骤了:

生成.o文件

所谓.o文件就是二进制文件,也就是库的原型。

# 到 src 目录下
cd src
# 编译产生 .o 文件
gcc *.c -c -I ../include/
  • -I 就是增加头文件的搜索路径

  • -c就是仅编译不链接

具体gcc参数见这里

然后这样就产生了两个add.omultiple.o文件了,下一步就是打包。

打包.o文件

所谓打包就是将这两个二进制.o文件合并在一起。打包用的命令就是ar:

# rcs 是参数配置,具体含义暂时没有深究
# libcaculate.a 就是最终打包后生成的静态文件
# *.o 就是打包所使用的原材料
ar rcs libcaculate.a *.o

然后就是将这个打包好的静态文件随便放哪里,但是按照一般习惯,是放在lib目录下的,所以这里移动一下:

mv ./libcaculate.a ../lib/

静态库使用

之后就是在main.c中使用这个编译好的静态库了。

# 先从 src 回到代码的根目录
cd ../
# 开始编译
gcc main.c -I ./include/ -L ./lib -l caculate -o main
# 然后就会生成一个 main 的可执行文件

在上面中使用到的gcc参数含义为:

  • -I:指定头文件

  • -L:指定库文件位置

  • -l:小写的L,指定库的名称,库的名称结构为lib库名称.a

  • -o:指定最终输出的文件名

动态库制作与使用

如果不讲动态库,那么你很难理解,什么叫动态库,其和静态库有什么区别。

还是上面的代码,只不过这一次我们将其制作为动态库的形式。


生成.o文件

还是在src目录下先制作.o文件:

gcc *.c -c -fpic -I ../include/
  • 加上了一个-fpic的参数,代表用来生成与位置无关的文件。

打包.o文件

上面打包静态库使用了ar命令,这里是使用gcc命令。

gcc -shared -o libmycaculate.so *.o
  • -shared:代表生成动态库

使用

这里就很有意思,也是和静态库最大的不同,假设这里还是像使用静态库一样的使用静态库:

gcc -I ./include/ -L ./lib/ -l mycaculate main.c -o main

编译是成功的,只是你尝试运行一下:

./main
# 输出错误警告
./main: error while loading shared libraries: libmycaculate.so: cannot open shared object file: No such file or directory

说人话就是找不到这个动态库,是不是超级生气,我告诉你了啊,在lib目录下的libmycaculate.so啊,可是操作系统愣是找不到,真是个傻子。

奈何在不如它牛逼之前智能照着它的规矩来,可以使用ldd命令查看当前的main文件调用了哪些动态库:

ldd main
# 输出的内容如下
	linux-vdso.so.1 (0x00007ffc6c1f5000)
	libmycaculate.so => not found
	libc.so.6 => /lib64/libc.so.6 (0x00007f2c8fab3000)
	/lib64/ld-linux-x86-64.so.2 (0x00007f2c8fe78000)

其中的重点:

libmycaculate.so => not found

所以下面的重点就是如何解决这个动态库找不到的问题。

动态库配置

参考博客

方式1:修改 /etc/ld.so.conf

我是Centos操作系统,不知道别的操作系统怎么样的。把上面的目录打开,就是一句很简单的话:

include ld.so.conf.d/*.conf

就像Nginx配置文件一样,支持以文件的形式来配置不同的动态库,那我们就简单搞一个calcuate.conf

在其中加一下我们的动态库路径:

# 注意一定要用 conf 结尾
vim caculate.conf

/home/root/example1/lib

这是我的路径,然后保存退出,接下来就是要让我们的配置生效:

ldconfig 
# 要用root权限或者 sudo

然后重新运行一下刚才生成的文件,就运行正确了。

方式2:修改环境变量 PATH

但是这个方法没有成功,我不知道为啥。。。。。。

总结

从上面的结构就能看到,静态库就是在生成可执行文件的时候就打包在里面了,而动态库则是在运行的时候才去找库文件。

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-08-20 14:54:29  更:2021-08-20 14:55:23 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/20 15:50:35-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码