关闭 x
IT技术网
    技 采 号
    ITJS.cn - 技术改变世界
    • 实用工具
    • 菜鸟教程
    IT采购网 中国存储网 科技号 CIO智库

    IT技术网

    IT采购网
    • 首页
    • 行业资讯
    • 系统运维
      • 操作系统
        • Windows
        • Linux
        • Mac OS
      • 数据库
        • MySQL
        • Oracle
        • SQL Server
      • 网站建设
    • 人工智能
    • 半导体芯片
    • 笔记本电脑
    • 智能手机
    • 智能汽车
    • 编程语言
    IT技术网 - ITJS.CN
    首页 » HTML5 »Linux 动态库生成与使用指南

    Linux 动态库生成与使用指南

    2015-03-11 00:00:00 出处:codeceo
    分享

    上一篇介绍了Linux 静态库生成指南,有兴趣的朋友可以前往阅读。

    Linux下动态库文件的文件名形如 libxxx.so,其中so是 Shared Object 的缩写,即可以共享的目标文件。

    在链接动态库生成可执行文件时,并不会把动态库的代码复制到执行文件中,而是在执行文件中记录对动态库的引用。

    程序执行时,再去加载动态库文件。假如动态库已经加载,则不必重复加载,从而能节省内存空间。

    Linux下生成和使用动态库的步骤如下:

    编写源文件。 将一个或几个源文件编译链接,生成共享库。 通过 -L<path> -lxxx 的gcc选项链接生成的libxxx.so。 把libxxx.so放入链接库的标准路径,或指定 LD_LIBRARY_PATH,才能运行链接了libxxx.so的程序。

    下面通过实例详细讲解。

    编写源文件

    建立一个源文件: max.c,代码如下:

    int max(int n1, int n2, int n3)
    {
        int max_num = n1;
        max_num = max_num < n2  n2: max_num;
        max_num = max_num < n3  n3: max_num;
        return max_num;
    }

    编译生成共享库:

    gcc -fPIC -shared -o libmax.so max.c

    我们会得到libmax.so。

    实际上上述过程分为编译和链接两步, -fPIC是编译选项,PIC是 Position Independent Code 的缩写,表示要生成位置无关的代码,这是动态库需要的特性; -shared是链接选项,告诉gcc生成动态库而不是可执行文件。

    上述的一行命令等同于:

    gcc -c -fPIC max.c
    gcc -shared -o libmax.so max.o

    为动态库编写接口文件

    为了让用户知道我们的动态库中有哪些接口可用,我们需要编写对应的头文件。

    建立 max.h ,输入以下代码:

    #ifndef __MAX_H__
    #define __MAX_H__
    
    int max(int n1, int n2, int n3);
    
    #endif

    测试,链接动态库生成可执行文件

    建立一个使用max函数的test.c,代码如下:

    #include <stdio.h>
    #include "max.h"
    
    int main(int argc, char *argv[])
    {
        int a = 10, b = -2, c = 100;
        printf("max among 10, -2 and 100 is %d.n", max(a, b, c));
        return 0;
    }

    gcc test.c -L. -lmax 生成a.out,其中-lmax表示要链接libmax.so。
    -L.表示搜索要链接的库文件时包含当前路径。

    注意,假如同一目录下同时存在同名的动态库和静态库,比如 libmax.so 和 libmax.a 都在当前路径下,
    则gcc会优先链接动态库。

    运行

    运行 ./a.out 会得到以下的错误提示。

    ./a.out: error while loading shared libraries: libmax.so: cannot open shared object file: No such file or directory

    找不到libmax.so,原来Linux是通过 /etc/ld.so.cache 文件搜寻要链接的动态库的。
    而 /etc/ld.so.cache 是 ldconfig 程序读取 /etc/ld.so.conf 文件生成的。
    (注意, /etc/ld.so.conf 中并不必包含 /lib 和 /usr/lib,ldconfig程序会自动搜索这两个目录)

    假如我们把 libmax.so 所在的路径添加到 /etc/ld.so.conf 中,再以root权限运行 ldconfig 程序,更新 /etc/ld.so.cache ,a.out运行时,就可以找到libmax.so。

    但作为一个简单的测试例子,让我们改动系统的东西,似乎不太合适。
    还有另一种简单的方法,就是为a.out指定 LD_LIBRARY_PATH。

    LD_LIBRARY_PATH=. ./a.out

    程序就能正常运行了。LD_LIBRARY_PATH=. 是告诉 a.out,先在当前路径寻找链接的动态库。

    对于elf格式的可执行程序,是由ld-linux.so*来完成的,它先后搜索elf文件的 DT_RPATH 段, 环境变量 LD_LIBRARY_PATH, /etc/ld.so.cache文件列表, /lib/,/usr/lib目录, 找到库文件后将其载入内存. (http://blog.chinaunix.net/uid-23592843-id-223539.html)

    makefile让工作自动化

    编写makefile,内容如下:

    .PHONY: build test clean
    
    build: libmax.so
    
    libmax.so: max.o
    	gcc -o $@  -shared $<
    
    max.o: max.c
    	gcc -c -fPIC $<
    
    test: a.out
    
    a.out: test.c libmax.so
    	gcc test.c -L. -lmax
    	LD_LIBRARY_PATH=. ./a.out
    
    clean:
    	rm -f *.o *.so a.out

    make build就会生成libmax.so, make test就会生成a.out并执行,make clean会清理编译和测试结果。

    上一篇返回首页 下一篇

    声明: 此文观点不代表本站立场;转载务必保留本文链接;版权疑问请联系我们。

    别人在看

    正版 Windows 11产品密钥怎么查找/查看?

    还有3个月,微软将停止 Windows 10 的更新

    Windows 10 终止支持后,企业为何要立即升级?

    Windows 10 将于 2025年10 月终止技术支持,建议迁移到 Windows 11

    Windows 12 发布推迟,微软正全力筹备Windows 11 25H2更新

    Linux 退出 mail的命令是什么

    Linux 提醒 No space left on device,但我的空间看起来还有不少空余呢

    hiberfil.sys文件可以删除吗?了解该文件并手把手教你删除C盘的hiberfil.sys文件

    Window 10和 Windows 11哪个好?答案是:看你自己的需求

    盗版软件成公司里的“隐形炸弹”?老板们的“法务噩梦” 有救了!

    IT头条

    公安部:我国在售汽车搭载的“智驾”系统都不具备“自动驾驶”功能

    02:03

    液冷服务器概念股走强,博汇、润泽等液冷概念股票大涨

    01:17

    亚太地区的 AI 驱动型医疗保健:2025 年及以后的下一步是什么?

    16:30

    智能手机市场风云:iPhone领跑销量榜,华为缺席引争议

    15:43

    大数据算法和“老师傅”经验叠加 智慧化收储粮食尽显“科技范”

    15:17

    技术热点

    商业智能成CIO优先关注点 技术落地方显成效(1)

    用linux安装MySQL时产生问题破解

    JAVA中关于Map的九大问题

    windows 7旗舰版无法使用远程登录如何开启telnet服务

    Android View 事件分发机制详解

    MySQL用户变量的用法

      友情链接:
    • IT采购网
    • 科技号
    • 中国存储网
    • 存储网
    • 半导体联盟
    • 医疗软件网
    • 软件中国
    • ITbrand
    • 采购中国
    • CIO智库
    • 考研题库
    • 法务网
    • AI工具网
    • 电子芯片网
    • 安全库
    • 隐私保护
    • 版权申明
    • 联系我们
    IT技术网 版权所有 © 2020-2025,京ICP备14047533号-20,Power by OK设计网

    在上方输入关键词后,回车键 开始搜索。Esc键 取消该搜索窗口。