当前位置: 首页 > news >正文

编译动态库与静态库的注意事项和方法

一 .编译动态库:

使用动态库的四种方法:

  1. export LD_LIBRARY_PATH=/usr/lib64/( so所在路径)

    只对当前用户的终端生效, 其他用户没用。

  2.在该 sudo vim /etc/ld.so.conf文件下; 将动态库的路径加进来;然后 sudo ldconfig -v 进行更新。(这种方法的弊           端,可能其他的操作系统没有这个配置文件)

     1)sudo vim /etc/ld.so.conf

      将(动态库的路径)加进来

    2)sudo ldconfig -v更新 动态库配置文件

  3.无论什么动态库, Linux操作系统,都是默认去该目录下 /usr/lib/查找使用的动态库;

    所以有两种办法:创建动态库的软连接至该目录;

    sudo ln -s (动态库的源文件)  /usr/lib;

    这个方法的好处:(动态库进行更新时,会把目录下的一起更新,不需要额外操作;不推荐把动态库拷贝至该目录下     因为更新时需要把该目录下的都更新)。

    sudo cp (动态库的源文件)   /usr/lib;

  4. 修改该用户下的 .bashrc 配置文件;将动态库的路径添加进来;重新执行配置文件:source .bashrc。(弊端:只              在当前用户下有用)

 

二. 静态库的使用与上述方法一样;

 

三. 最易忽视的步骤:

  上面方法成功后,当编译程序时,可能还会出现找不到动态库的情况。(重点,本人已经在这里吃过好几次亏了)

  此时:1. 需要在编译程序时加上  -lm -ldl ;(有时加1个就有用,加2个也没有坏处,以我目前的水平来看)

      2.同时注意:切记加上述两项时,一定要放到最末尾。原因:现在不明;

 

四。奉上自己写的一段 Makefile

 1 CC=gcc
 2 CPPFLAGS= -I /home/yyx/02/openssl-1.0.1t/include/
 3 CFLAGS=-Wall -g
 4 LIBPATH = -L /usr/lib
 5 LIBS= -lssl -lcrypto -lhiredis -lm -ldl
 6 
 7 
 8 #找到当前目录下所有的.c文件
 9 src = $(wildcard ./src/*.c)
10 
11 #将当前目录下所有的.c  转换成.o给obj
12 obj = $(patsubst %.c, %.o, $(src))
13 
14 rsa = test_rsa
15 
16 target = $(rsa)
17 
18 ALL:$(target)
19     
20 #生成所有的.o文件
21 $(obj):%.o:%.c
22     $(CC) -c $< -o $@ $(CPPFLAGS) $(LIBPATH) $(LIBS) $(CFLAGS) 
23     
24 #test_rsa程序
25 $(rsa):./src/test.o  
26     $(CC) $^ -o $@ $(CPPFLAGS)  $(LIBPATH) $(LIBS) $(CFLAGS)    
27  
28  
29 #clean指令
30 
31 clean:
32     -rm -rf $(obj) $(target) ./test/*.o
33 
34 #将clean目标 改成一个虚拟符号
35 .PHONY: clean ALL

 

 五. 注意Linux下编译动态库的时候, 可能产生的链接问题;

  1.该问题当时产生的情况: 在同一个文件夹下, 对一份文件进行了 多次备份(每次更新时都会);  导致的情况: 一个 .h 头文件中包含的函数 会在多个文件中 都有实现;  

  -----------------------

  产生的问题:  1. 直接编译 可执行程序, 运行 .h头文件 中的各项函数实现, 没有任何问题产生.

        2.当编译动态库后, 加载到 其他程序中运行时, 此时 会出现 段错误;  原因是: 动态库中可能有 函数连接到 别的 .c 实现文件中去了, 导致出现链接不上的错误.

        此时一运行程序, 当加载到这步时, 就出现段错误....

 

 

 

 

转载于:https://www.cnblogs.com/yyx1-1/p/6115403.html

相关文章:

  • 《写给大忙人的hadoop2》读书笔记(一)大数据定义
  • Flume OG 与 Flume NG 的对比
  • Android:LinearLayout布局中Layout_weight的深刻理解
  • python 库集合
  • 建议Javascript以后都用严格模式
  • 表空间对空闲区的管理方式
  • RegExp
  • Java并发编程(五)Lock
  • 学技术怎可成为”快餐”?
  • KVM中镜像格式的选择
  • SQL server 添加字段问题
  • 阿里中间件(Aliware)双十一专题——“分布式事务中间件GTS(TXC)”
  • apache shiro的工作流程分析
  • margin和padding的区别
  • Linux date 用法
  • CSS相对定位
  • egg(89)--egg之redis的发布和订阅
  • github从入门到放弃(1)
  • java中具有继承关系的类及其对象初始化顺序
  • npx命令介绍
  • SQLServer之创建显式事务
  • 阿里云Kubernetes容器服务上体验Knative
  • 当SetTimeout遇到了字符串
  • 分布式熔断降级平台aegis
  • 复杂数据处理
  • 开源SQL-on-Hadoop系统一览
  • 深度学习在携程攻略社区的应用
  • 使用 5W1H 写出高可读的 Git Commit Message
  • 算法-图和图算法
  • 曾刷新两项世界纪录,腾讯优图人脸检测算法 DSFD 正式开源 ...
  • # 数据结构
  • #NOIP 2014# day.1 生活大爆炸版 石头剪刀布
  • (C语言)编写程序将一个4×4的数组进行顺时针旋转90度后输出。
  • (done) NLP “bag-of-words“ 方法 (带有二元分类和多元分类两个例子)词袋模型、BoW
  • (JS基础)String 类型
  • (react踩过的坑)Antd Select(设置了labelInValue)在FormItem中initialValue的问题
  • (Redis使用系列) Springboot 实现Redis 同数据源动态切换db 八
  • (超简单)使用vuepress搭建自己的博客并部署到github pages上
  • (原創) 未来三学期想要修的课 (日記)
  • .describe() python_Python-Win32com-Excel
  • .Net Core/.Net6/.Net8 ,启动配置/Program.cs 配置
  • .Net Core与存储过程(一)
  • .NET Project Open Day(2011.11.13)
  • .net 提取注释生成API文档 帮助文档
  • .NET 同步与异步 之 原子操作和自旋锁(Interlocked、SpinLock)(九)
  • .NET/C# 将一个命令行参数字符串转换为命令行参数数组 args
  • .NET6使用MiniExcel根据数据源横向导出头部标题及数据
  • @RequestMapping-占位符映射
  • [ Linux 长征路第二篇] 基本指令head,tail,date,cal,find,grep,zip,tar,bc,unname
  • [ MSF使用实例 ] 利用永恒之蓝(MS17-010)漏洞导致windows靶机蓝屏并获取靶机权限
  • [ 蓝桥杯Web真题 ]-布局切换
  • [\u4e00-\u9fa5] //匹配中文字符
  • [《百万宝贝》观后]To be or not to be?
  • [202209]mysql8.0 双主集群搭建 亲测可用
  • [boost]使用boost::function和boost::bind产生的down机一例