动态库链接问题解决
2017-04-26 16:04
204 查看
一 .编译动态库:
使用动态库的四种方法:
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
五. 注意Linux下编译动态库的时候, 可能产生的链接问题;
1.该问题当时产生的情况: 在同一个文件夹下, 对一份文件进行了 多次备份(每次更新时都会); 导致的情况: 一个 .h 头文件中包含的函数 会在多个文件中 都有实现;
———————–
产生的问题: 1. 直接编译 可执行程序, 运行 .h头文件 中的各项函数实现, 没有任何问题产生.
2.当编译动态库后, 加载到 其他程序中运行时, 此时 会出现 段错误; 原因是: 动态库中可能有 函数连接到 别的 .c 实现文件中去了, 导致出现链接不上的错误.
此时一运行程序, 当加载到这步时, 就出现段错误….
使用动态库的四种方法:
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
CC=gcc CPPFLAGS= -I /home/yyx/02/openssl-1.0.1t/include/ CFLAGS=-Wall -g LIBPATH = -L /usr/lib LIBS= -lssl -lcrypto -lm -ldl #找到当前目录下所有的.c文件 src = $(wildcard ./src/*.c) #将当前目录下所有的.c 转换成.o给obj obj = $(patsubst %.c, %.o, $(src)) rsa = test_rsa server01 = server_ssh_test client01 = client_ssh_test server02 = many_project_ssh_test test = test_app target = $(client01) ALL:$(target) #生成所有的.o文件 $(obj):%.o:%.c $(CC) -c $< -o $@ $(CPPFLAGS) $(LIBPATH) $(LIBS) $(CFLAGS) #client01程序 $(client01):./src/client_ssh.o $(CC) $^ -o $@ $(CPPFLAGS) $(LIBPATH) $(LIBS) $(CFLAGS) #clean指令 clean: -rm -rf $(obj) $(target) ./src/*.o #将clean目标 改成一个虚拟符号 .PHONY: clean ALL
五. 注意Linux下编译动态库的时候, 可能产生的链接问题;
1.该问题当时产生的情况: 在同一个文件夹下, 对一份文件进行了 多次备份(每次更新时都会); 导致的情况: 一个 .h 头文件中包含的函数 会在多个文件中 都有实现;
———————–
产生的问题: 1. 直接编译 可执行程序, 运行 .h头文件 中的各项函数实现, 没有任何问题产生.
2.当编译动态库后, 加载到 其他程序中运行时, 此时 会出现 段错误; 原因是: 动态库中可能有 函数连接到 别的 .c 实现文件中去了, 导致出现链接不上的错误.
此时一运行程序, 当加载到这步时, 就出现段错误….
相关文章推荐
- Release模式下加载FFmpeg提示“无法定位程序输入点XXX与动态链接库XXX.dll ”的问题解决
- 解决“无法定位序数***于动态链接库iertutil.dll上”的问题
- linux动态链接共享库(如何解决应用程序跑不起来not found等问题)
- 解决龙芯3A Debian6.0.3 o32系统编译oprofile的libbfd动态链接问题
- 关于linux动态链接共享库(如何解决应用程序跑不起来not found等问题)
- QT 之动态链接问题解决
- 动态链接库知识点归纳之二(如何添加类,如何解决名字改变问题)
- 解决“无法定位程序输入点ucrtbase.terminate于动态链接库api-ms-win-crt-runtime-|1-1-0.dll“问题
- Linux下编译出来的动态链接库缺少so后缀的问题解决
- Linux 64bit matlab2012a安装MCR Installer,解决无法打开动态链接库问题
- 解决动态链接库中@@OPENSSL_0.9.8符号引起的问题
- 解决 Net::ZooKeeper找不到动态链接库符号问题
- 关于linux动态链接共享库(如何解决应用程序跑不起来not found等问题)
- 解决Twitter Bootstrap Tab URL链接问题
- 通过Ajax动态生成的页面,解决复选框,选择一次不能再选择的问题
- linux下动态链接问题(so文件的编写与调用)
- 交叉编译工具安装缺少动态库问题解决方法
- oracle 关于“以用户administrator的身份链接主机失败”的问题解决
- EasyUI的treegrid组件动态加载数据问题的解决办法
- 动态创建的 HTML 控件提交后数据丢失问题及解决