文档章节

linux下动态库的编写和调用

青灯夜
 青灯夜
发布于 2015/09/01 22:10
字数 545
阅读 14
收藏 0

linux下动态库的编写和调用

  linux下编写和调用一个简单的动态库大概分为以下几个步骤:

  • 创建动态库程序文件
    add.c
int add(int a,int b)
{
    return a+b;
}
  • 创建引用头文件
    head.c
#ifndef _HEAD_
#define _HEAD_

int add(int a,int b);


#endif
  • 生成目标文件
    生成要加编译器选项 -fpic
gcc -fpic  -c  add.c
  • 然后生成动态库
    注意使用链接器选项 -shared
gcc  -shared –o  libhead.so  add.o
  • 编写主程序进行调用
    main.c
#include <stdio.h>
#include "head.h"

int main(void)
{
    printf("3+5 sum = %d \n",add(3,5));
    return 0;
}
  • 生成可执行文件并链接库文件
    编译程序时,使用动态链接库和静态库是一致的,使用”-l库名”的方式。
 gcc -o  main  main.c -L  ./  -lhead

  -L指定动态链接库的路劲,-ldXX链接库函数XX。-lXX是动态库的调用规则。Linux系统下的动态库命名方式是lib*.so,而在链接时表示位-l*,*是自己命名的库名。

  • 报错解决
error while loading shared libraries: libhead.so:  cannot open shared object file: No such file or directory

  这是因为程序运行时没有找到动态链接库的原因,注意linux不会自动在当前目录查找动态库文件。解决方案一般有三种,借鉴博客园SmartVessel原文

(1.) 用ln将需要的so文件链接到/usr/lib或者/lib这两个默认的目录下边

ln -s /home/用户名/code/lib/*.so  /usr/lib
sudo ldconfig

  注意填写你的动态库所在目录的路径,若不知道可以用pwd查看全路径。如果路径不对,可能会报错:

cannot open shared object file: Error 40

(2.) 修改LD_LIBRARY_PATH

export LD_LIBRARY_PATH=/home/用户名/code/lib/:$LD_LIBRARY_PATH
sudo ldconfig

(3.) 修改/etc/ld.so.conf,然后刷新

vim /etc/ld.so.conf

add /home/用户名/code/lib/
sudo ldconfig

  必须记得更新sudo ldconfig,否则还是会报错。

  • 运行测试
./main 3+5 sum = 8

  好啦,测试成功,有问题可以留言讨论!

版权声明:本文为csdn博主[applebite](http://blog.csdn.net/applebite) 原创文章,转载请注明出处,侵权必究。 微信添加公众号:qi_chuang 或 猎奇创新平台

© 著作权归作者所有

青灯夜
粉丝 2
博文 35
码字总数 21708
作品 0
朝阳
程序员
私信 提问
[动态库]深入分析Windows和Linux动态库应用异同

摘要:动态链接库技术实现和设计程序常用的技术,在Windows和Linux系统中都有动态库的概念,采用动态库可以有效的减少程序大小,节省空间,提高效率,增加程序的可扩展性,便于模块化管理。 ...

龙宝宝
2011/08/05
170
0
深入分析Windows和Linux动态库应用异同

摘要:动态链接库技术实现和设计程序常用的技术,在Windows和Linux系统中都有动态库的概念,采用动态库可以有效的减少程序大小,节省空间,提高效率,增加程序的可扩展性,便于模块化管理。 ...

晨曦之光
2012/03/02
114
0
深入分析Windows和Linux动态库应用异同

摘要:动态链接库技术实现和设计程序常用的技术,在Windows和Linux系统中都有动态库的概念,采用动态库可以有效的减少程序大小,节省空间,提高效率,增加程序的可扩展性,便于模块化管理。 ...

长平狐
2013/01/06
98
0
Linux中的静态库和动态库简介及生成过程示例

【文章摘要】 在实际的软件开发项目中,不是每一行代码都需要我们亲自写。在我们的软件产品中,有一些代码(尤其是函数)的出现频率很高,它们可以被当作公共代码来反复使用。为了避免重复劳动...

dukeke
2015/11/09
0
0
安卓程序员,Linux,java,有趣的架构。

先来看常见的Linux系统架构,你可以参考Linux的架构 内核是系统的底层。Linux开机后,内核即启动,并存活于属于自己的内存空间,即内核空间(kernel space)。内核的一大功能是和硬件通信。内核...

android自学
2018/07/24
0
0

没有更多内容

加载失败,请刷新页面

加载更多

golang-字符串-地址分析

demo package mainimport "fmt"func main() {str := "map.baidu.com"fmt.Println(&str, str)str = str[0:5]fmt.Println(&str, str)str = "abc"fmt.Println(&s......

李琼涛
今天
4
0
Spring Boot WebFlux 增删改查完整实战 demo

03:WebFlux Web CRUD 实践 前言 上一篇基于功能性端点去创建一个简单服务,实现了 Hello 。这一篇用 Spring Boot WebFlux 的注解控制层技术创建一个 CRUD WebFlux 应用,让开发更方便。这里...

泥瓦匠BYSocket
今天
6
0
从0开始学FreeRTOS-(列表与列表项)-3

FreeRTOS列表&列表项的源码解读 第一次看列表与列表项的时候,感觉很像是链表,虽然我自己的链表也不太会,但是就是感觉很像。 在FreeRTOS中,列表与列表项使用得非常多,是FreeRTOS的一个数...

杰杰1号
今天
8
0
Java反射

Java 反射 反射是框架设计的灵魂(使用的前提条件:必须先得到代表的字节码的 Class,Class 类 用于表示.class 文件(字节码)) 一、反射的概述 定义:JAVA 反射机制是在运行状态中,对于任...

zzz1122334
今天
5
0
聊聊nacos的LocalConfigInfoProcessor

序 本文主要研究一下nacos的LocalConfigInfoProcessor LocalConfigInfoProcessor nacos-1.1.3/client/src/main/java/com/alibaba/nacos/client/config/impl/LocalConfigInfoProcessor.java p......

go4it
昨天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部