【GCC编译】运行编译后的程序报错 error while loading shared libraries: lib*.so: cannot open shared object file[通俗易懂]

【GCC编译】运行编译后的程序报错 error while loading shared libraries: lib*.so: cannot open shared object file[通俗易懂]运行编译后的程序报错errorwhileloadingsharedlibraries:lib*.so:cannotopensharedobjectfile:Nosuchfileordirectory   运行编译后的程序报错errorwhileloadingsharedlibraries:lib*.s…

大家好,又见面了,我是你们的朋友全栈君。

运行编译后的程序报错 error while loading shared libraries: lib*.so: cannot open shared object file: No such file or directory

  运行编译后的程序报错  error while loading shared libraries: lib*.so: cannot open shared object file: No such file or directory

————————————————————————————————————————————————- 

  首先说明一下,这个题目有点长,但是却很好地反应了遇到的问题点。

  在《如何用C代码生成二维码》一文中,小编也向大家展示了在正确无误地编译好qrcode_test程序后,运行报错的问题。这次我们再拿出来说一说。

当时在终端手动./运行程序报错的提示 ./qrcode_test: error while loading shared libraries: libzint.so.2.4: cannot open shared object file: No such file or directory

【GCC编译】运行编译后的程序报错 error while loading shared libraries: lib*.so: cannot open shared object file[通俗易懂]

  大概的意思就是在运行程序的时候,没有找到程序所需的libzint.so动态库。大家都知道,动态库与静态库的最大区别就是:静态库是静态链接,也就是在生产可执行文件的时候就把静态库中的实现嵌入到程序中了,一旦编译成功了,静态库也就有存在的价值了,即便静态库不存在了,可执行程序也是可以跑起来的;但是动态库就不一样了,它是遵循动态链接,也是就说编译的时候需要指定路径去找该so文件链接编译,运行的时候也需要指定相应的路径去找。如果在运行的时候,可执行程序会先去默认的系统lib目录下,寻找该so,如果找不到了,就该报错了:error while loading shared libraries。(可以通过该文章,了解下动态库的动态加载机制 http://blog.csdn.net/dbzhang800/article/details/6918413

  上面这一段话,讲可执行程序运行时去找so文件,讲得比较笼统,以下总结以下:

  动态库的搜索路径搜索的先后顺序是: 

  1.编译目标代码时指定的动态库搜索路径;

  2.环境变量LD_LIBRARY_PATH指定的动态库搜索路径; 

  3.配置文件/etc/ld.so.conf中指定的动态库搜索路径;

  4.默认的动态库搜索路径/lib    /usr/lib。

  可参考下这篇博文,它里面提及了gcc编译动态库和运行链接动态库的知识。linux-gcc 编译时头文件和库文件搜索路径 – zhengmeifu – 博客园

  回到可执行程序运行报error while loading shared libraries错的问题上来,在《如何用C代码生成二维码》一文中,也讲到了如何避过这种错误而将程序跑起来,我们使用的是上面提及的2.环境变量LD_LIBRARY_PATH指定的动态库搜索路径;”,即通过设置LD_LIBRARY_PATH,把当前程序使用的so的路径添加到LD_LIBRARY_PATH中去,这样程序跑起来的时候,去LD_LIBRARY_PATH找肯定就可以找到该so了。当然之前我们也已经验证了此方法的正确性。

   

【GCC编译】运行编译后的程序报错 error while loading shared libraries: lib*.so: cannot open shared object file[通俗易懂]

  看,程序运行就没有问题。

  如果仅仅又是重复介绍该方法,那么此文存在的意义就不大了。此文最大的意义在于,告诉读者,我们可以不用设置LD_LIBRARY_PAT,也一样可以把程序跑起来,那么我们该从那里下手呢?本文主要介绍,从编译该程序开始。

这里就要先介绍下gcc的编译选项了,但这里不具体细说,有兴趣可以通过man gcc去了解,或者从博文的上一篇文章  【转载】gcc 使用中常用的参数及命令【转载】gcc 使用中常用的参数及命令 – 架构师李肯 – 博客园 去了解。

  这里,我们需要用到的编译选项是-Wl,-rpath;主要这里是字母l,而不是数字1。-rpath选项就是告诉gcc在编译链接的时候,把该程序的运行是查找so的路径写入到ELF文件中。使用方法就是 gcc –o OutApp *.c –lzint –Wl,-rpath=”/usr/local/lib”或gcc –o OutApp *.c –lzint –Wl,-rpath –Wl,“/usr/local/lib”两者在功能是等价的。如下图所示:

   

【GCC编译】运行编译后的程序报错 error while loading shared libraries: lib*.so: cannot open shared object file[通俗易懂]

  从图中我们可看到,确实编译成功后直接运行程序就不会再报error while loading shared libraries了,而且这种方法最大的好处就是,在编译成功后,不用再去做任何设置就可以把程序跑起来了,当然是编译时传递的-rpath参数得是正确的。这个方法,尤其是在交叉编译嵌入式设备的可执行程序时,十分有用。不妨读者可以自己试试看。

posted @ 2016-10-30 01:01
Mr.Recan 阅读(…) 评论(…)
编辑
收藏
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/149267.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • 硬件知识入门「建议收藏」

    硬件知识入门「建议收藏」各位有哪些方面想要了解的,我懂得就都解释给大家,要不我自己也想不到更新哪些方面

  • 常用的分布式事务解决方案有哪些_分布式事务redis解决方案

    常用的分布式事务解决方案有哪些_分布式事务redis解决方案首页 博客 专栏·视频 下载 论坛 问答 代码 直播 能力认证 高校会员中心收藏动态消息创作中心常用的分布式事务解决方案凌澜星空2018-03-1114:44:5575315收藏466分类专栏:架构高性能网站微服务项目实战文章标签:微服务分布式架构事务一致性版权众所周知,数据库能实现本地事务,也就是在同一个数据库中,你可以允许一组操作要么全都正确执行,要么全都不执行。这里特别强调了本地事务,也就是目前的…

    2022年10月26日
  • C++ 使用system()实现锁定屏幕「建议收藏」

    C++ 使用system()实现锁定屏幕「建议收藏」除了使用函数“LockWorkStation()”实现锁定屏幕,参考:http://www.cnblogs.com/Satu/p/8183081.html此外,也可以使用函数“system()”来实现。IDE:Code::Blocks16.01操作系统:Windows7x641#include<windows.h>23intmain(…

  • Verilog hdl与VHDL混用详解

    Verilog hdl与VHDL混用详解Veriloghdl与VHDL混用详解1.概述由于在FPGA开发过程中,多人合作时可能遇到有人使用veriloghdl,有人遇到VHDL的情况,这就涉及到了veriloghdl与VHDL的相…

  • matlab里for循环语句_matlab中的for循环语句

    matlab里for循环语句_matlab中的for循环语句matlab循环语句for怎么用?matlab中for语句使用方法和应用实例for循环语句1、一般格式为:forx(循环变量)=array(数组)commands(执行的循环代码)end2、array可以是一个数字,也可以是数组,例如输入:fora=5fora=1:5fora=1:1:5(以1为步长到5)只不过在a=1:5和a=1:1:5时,会显示之间的结果,a=5时只显示最后结果。a…

  • 开源3d可视化软件_开源的可视化大屏

    开源3d可视化软件_开源的可视化大屏第一节、 技术开发环境中的社会环境    这篇文章迟迟没有写出来奉献给一些爱好音频视频开发的网友,是有很多原因的,TI在短时间内,针对高清音视频方案DM365/368,连续发布DVSDK3.0,DVSDK4.00,DVSDK4.01和DVSDK4.02,这点让我们很不适应。虽然我们的DM365/368核心板早已经出来,但是需要做开发板,并调试开…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号