💐 🌸 🌷 🍀 🌹 🌻 🌺 🍁 🍃 🍂 🌿 🍄🍝 🍛 🍤
📃个人主页 :阿然成长日记 👈点击可跳转
📆 个人专栏: 🔹数据结构与算法🔹C语言进阶🔹C++🔹Liunx
🚩 不能则学,不知则问,耻于问人,决无长进
🍭 🍯 🍎 🍏 🍊 🍋 🍒 🍇 🍉 🍓 🍑 🍈 🍌 🍐 🍍
文章目录
- 一、前言:
- 二、继续使用这四个文件
- 三、动态库的制作
- 第一步:
- 第二步:
- 第三步:
- 四、整合将以上步骤,使用makefile自动化构建
- 五、小结
- 六、动态库的使用
一、前言:
续上一篇博客讲解了静态库的制作过程,本篇博客将开始动态库制作的讲解。一定要看了静态库的制作后,才能更好的理解动态库的制作过程。
二、继续使用这四个文件
分别创建了4个文件:mymath.h mymath.c myprint.h myprint.c.
- 1.<mymath.h>:
#pragma once
#include<stdio.h>
extern int addToTarget(int start, int end);//声明函数
- 2.mymath.c
#include "mymath.h" #
//这段函数的作用是计算start-end之间的和
int addToTarget(int start, int end)
{
int sum = 0;
int i = start;
for(i; i <= end; i++)
{
sum += i;
}
return sum;
}
- 3.myprint.h
#pragma once
#include<stdio.h>
#include<time.h>
extern void Print(const char* str);
- 4.myprint.c
#include "myprint.h"
//这段函数功能是输出传入的字符串,后面加上时间戳
void Print(const char* str)
{
printf("%s[%d]\n",str,(int)(time(NULL)));
}
三、动态库的制作
相对于静态库的制作,动态库的制作步骤也是十分相似。
第一步:
我么也需要先将.c文件编译成.o文件,但此时需要加上选项
-fPIC.
- 选项
-fPIC
是指生成位置独立代码
(Position Independent Code,PIC)。它通常用于创建可在不同内存地址空间加载的共享库(动态链接库)。
执行如下指令:
gcc -fPIC -c myprint.c -o myprint.o
gcc -fPIC -c mymath.c -o mymath.o
第二步:
将这些.o文件它打包成动态库。但是它没有单独的命令,只能使用gcc进行打包,但是需要加上
-shared
的选项
执行代码:
gcc -shared myprint.o mymath.o -o libhello.so
第三步:
将.so动态库文件和对应的头文件.h规整拷贝到一起。
如下图:将libhello.so文件也放入lib目录中,对应的头文件依然在include目录中,lib目录中此时就存在了一个静态库和一个动态库。
四、整合将以上步骤,使用makefile自动化构建
相较于静态库的制作,红色框框圈起来的便是制作动态库新加入的代码。
此时我们便可以利用tar指令打包发送到网上,然后让别人使用了。
五、小结
六、动态库的使用
相对于静态库的使用是通过指定路径的方式,动态库的使用恰恰相反。不能使用指定路径的方式。
首先,我们要知道gcc默认使用动态库的。
只存在静态库 | cc就只能针对该库进行静态链接 |
---|---|
同时存在动静态库 | 默认使用动态库 |
同时存在动静态库,但是想使用静态库 | 指令后面加上 -static。格式:gcc main.c -I ./hello/include/ -L ./hello/lib/ -lhello -static |
为什么不能使用指定路径的方法?
- 还记得我们在制作动态库时,使用过gcc -fPIC选项吗?它的作用就是生成
位置独立代码
,所以这个动态库其实一个独立的文件。动态库可以和可执行程序分批加载
! - 而我们指定路径是给gcc指定查找的,是告诉了gcc的动态库的路径。
但是 当我们运行和加载的时候,就和gcc没有关系了,所以我们要告诉操作系统或者加载器
这个动态库的路径! - 那为什么静态库可以使用呢?
静态链接的一旦编译好,就和库没有关系了,因为已经把库中代码拷贝到自己写的C/C++代码中了.即已经在可执行程序中了.
正确的使用方法:
我们只需要把我们的库的路径导入到这个环境变量【LD_LIBRARY_PATH】里面,这个是库加载时搜索的路径。
格式:export
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:库文件路径
导入完成后,此时我们便可以成功运行了。但是这样也有一个缺点,就是每次退出之后环境变量就会清空,又得重新导入。那有没有永久性存在的 方法呢,同时保证不会污染原有的库。
- 答案是有的;修改配置文件
只需要在/etc/ld.so.conf.d/路径下 随便创建一个文件。
然后vim打开文件,输入你动态库文件路径,然后退出保存即可.
未来交付给别人使用只需要提供【头文件】+【库】,不提供【源代码】