动态库(.so)的制作
扩展:
linux gcc命令
- 描述:
a. 动态库也叫共享库
b. 动态库把对一些库函数的链接载入推迟到程序运行的时期(runtime)。
c. 可以实现进程之间的资源共享。
d. 将一些程序升级变得简单。
e. 甚至可以真正做到链接载入完全由程序员在程序代码中控制。
f. 动态链接库的名字形式为 “libxxx.so” 后缀名为 “.so”。
g. windows共享库是以 .dll 为后缀的文件。 - 特点:
a. 在程序编译时并不会被链接到目标代码中,而是在程序运行是才被载入,系统会在动态库环境变量所指定的目录下去找对应名字的动态库。
b. 在程序运行时还需要动态库存在,
c. 代码体积较小
d. 不同的应用程序如果调用相同的库,那么在内存里只需要有一份该共享库的实例。 - 创建动态库(测试例程在结尾):
a. 将库源文件编译成.o的目标文件–> gcc -c mylib.c -o mylib.o //将.c文件生成.o文件
b. 将.o文件制作成动态库文件 --> gcc [-shared] -fPIC -o libmylib.so mylib.o //这里的-shared是默认的,不写也可以 ;-fPIC 创建与地址无关的编译程序
c. 编译test.c 同时链接制作的动态库 --> gcc -o test test.c -L. -lmylib // -L库的路径 -l库名 - 使用ldd命令查看可执行程序所依赖的动态库:
可以看到libmylib.so动态库没有找到,需要配置该动态库的路径。
- 配置该动态库路径位置路径 :
动态库默认路径为/lib 或者 /usr/lib,有以下方法配置。
a. 方法1:将libmylib.so动态库放到/lib 或者 /usr/lib目录下。
b. 方法2:将动态库所在的路径加入配置文件: /etc/ld.so.conf 的后面,如下:
打开文件: sudo vim /etc/ld.so.conf
使用pwd命令查看当前libmylib.so动态库所在的路径
ld.so.conf文件里添加libmylib.so动态库的路径,如下一行:
/media/sf_VirtualBox_share/库的制作
运行动态链接库管理命令:sudo ldconfig
c. 方法3:将动态库所在的路径临时加入到环境变量中: LD_LIBRARY_PATH
执行下面的命令:
export LD_LIBRARY_PATH=./
./表示将当前路径临时加入到环境变量中,也就是这个路径–>
/media/sf_VirtualBox_share/库的制作
注意: 这个方法只对当前使用的shell终端有效。 - 再次使用ldd命令查看可执行文件所依赖的动态库
可以看到libmylib.so库找到了。
- 注意:
将程序与动态库建立关系时,-L参数用于指定动态库的具体路径。-L.表示所要链接的库在当前目录下。而建立链接后需要把动态库放到指定的位置,这样在可执行程序运行时能正确加载动态库。 - ldconfig命令 :
ldconfig 命令的用途,主要是在默认搜寻目录 (/lib和/usr/lib) 以及动态库配置文件/etc/ld.so.conf内所列的目录下,搜索出可共享的动态链接库,进而创建出动态装入程序 (ld.so) 所需的连接和缓存文件.缓存文件默认为 /etc/ld.so.cache,此文件保存已排好序的动态链接库名字列表。 - 动态库与静态库混合连接
如果只使用–shared(默认选项)会造成所有的库都使用动态链接的方式。这时候需要使用 - Wl,option将option作为一个选项传递给链接器,链接器就可以让后面的库进行不同方式的链接。比如 gcc -L. -o test test.c -Wl,-Bstatic -lmystaticlib -Wl,-Bdynamic -lmysharelib。这里需要保证动态链接放在后面,以让动态库(如标准库)能在默认的共享库路径去寻找共享库。也可以写成 gcc -L. -o test test.c -Wl,-Bdynamic -lmysharelib -Wl,-Bstatic -lmystaticlib -Wl,-Bdynamic。 - 测试例程:
mylib.c 文件
int myplus(int a,int b);int mysub(int a,int b);int myplus(int a,int b){return a + b;}int mysub(int a,int b){return a - b;}
test.c 文件
#include <stdio.h>int myplus(int a,int b);extern int mysub(int a,int b);extern int main(void){int a,b;printf("请输入a和b:");scanf("%d%d",&a,&b);printf("%d + %d = %d\n",a,b,myplus(a,b));printf("%d - %d = %d\n",a,b,mysub(a,b));return 0;}
参考:
ldconfig及LD_LIBRARY_PATH
动态库(.so)的制作相关推荐
- 静态库.a和动态库.so的制作
静态库 gcc add.c -o add.o -c ar rcs libadd.a add.o gcc main.c libadd.a -o main./main 动态库 gcc add.c -o a ...
- 【Linux】Linux下静态库(.a)和动态库(.so)的制作和使用
如有错误,欢迎大家指正,感谢! 目录 一.程序工作过程简单介绍 1. 安装GCC 2. 源程序工作流程 3. 使用示例 4. gcc常用的编译参数选项 二.静态库的制作及使用 1. 库是 ...
- 动态库和静态库的创建
库:一组别人实现好的函数接口 1.命名方法 静态库 : libname.a 动态库 : libname.so 注意 :库的名字是name 2.链接动态库和静态库的区别 预处理,编译,汇编 ...
- Linux静态库和动态库的设计
静态库和动态库的设计 宗旨:技术的学习是有限的,分享的精神是无限的. Linux应用程序设计中需要的外部函数主要由函数库和系统调用来提供 Linux应用程序使用的主要函数库均存放于/lib, /usr ...
- Linux编程(5)_静态库与动态库
1 库是什么 假如你写了一个perfect的项目, 有公司想要购买的你的源代码, 此时你肯定不想把你的源代码就这么给别人, 你只想让别人使用就够了. 那么你可以把的源代码生成为.o二进制文件, 封装成 ...
- bazel 链接第三方动态库_Linux 动态库与静态库制作及使用详解
Linux 应用开发通常要考虑三个问题,即:1)在 Linux 应用程序开发过程中遇到过标准库链接在不同 Linux 版本下不兼容的问题: 2)在 Linux 静态库的制作过程中发现有别于 Windo ...
- Linux中gcc的编译、静态库和动态库的制作
欢迎大家关注笔者,你的关注是我持续更博的最大动力 Linux中gcc的编译.静态库.动态库 文章目录: 1 gcc的编译过程 1.1 gcc的编译过程 1.2 gcc的常用参数 2 gcc 静态库的制 ...
- bazel 链接第三方动态库_C语言学习篇(31)——linux中制作动态链接库
引言 前面我们讲解了什么是函数库(函数库就是一些事先写好的函数集合),函数库有什么作用(可以打包我们的编写的源代码,供他人使用,同时源码不可见,保护了自己的知识产权)以及函数库有2种提供方式:静态链接 ...
- Linux下的vim编辑器与gcc编译器及静动态库的制作
1.vim编辑器的使用: (1)vim的三种模式: 命令模式:打开文件默认进入命令模式 编辑模式:需要输入一些命令切换到编辑模式 末行模式:在末行模式可以输入一些命令 命令模式aios和AIOS都可以 ...
最新文章
- Diomidis Spinellis:有效的调试
- 中国新十大军工企业名单及简称 十大军工集团 原十大军工集团
- 史上最全的Chrome使用技巧集锦
- 【图文并茂】DEV配置NTL库
- POJ2195 Going Home 最小费用最大流
- boost::core::typeinfo的用法实例
- 【爬虫】beautiful soup笔记(待填坑)
- python之torchlight使用_python游戏编程之pgzero使用介绍
- 做「容量预估」可没有true和false
- oracle捕捉所有异常,如何捕获和处理特定的Oracle异常?
- 如何完整卸载wxpython_TextCtrl的WXPython C++部分被删除
- 将x86平台的Linux控制台重定向到串口
- script标签的for属性和event属性
- 个人地理数据库与文件地理数据库的区别
- uandroidtool使用教程_apktool反编译详细使用教程_图文教程
- 软件开发外包平台有哪些?收集的一些备用
- 类似igoogle div拖拽 demo
- 3D中的OBJ文件格式详解(转)
- 石门一中2021年高考成绩查询,石门一中火了!2020年高考成绩再次刷新记录
- Android应用启动之从Launcher拉起APP(三)