【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 阅读(…) 评论(…)
编辑
收藏
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

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

(0)
上一篇 2022年6月16日 下午11:29
下一篇 2022年6月16日 下午11:29


相关推荐

  • 微信第三方登录步骤

    微信第三方登录步骤一 开发者认证认证成功后 创建网站应用 也需要企业签字盖章 还需要备案的域名 作为微信的回调 创建完成后 获取到 appid 和 appsecret 配置好回调域名 二 配置回调域名 Host 文件配置三 获取 code 第三方发起微信授权登录请求 微信用户允许授权第三方应用后 微信会拉起应用或重定向到第三方网站 并且带上授权临时票据 code 参数 https open weixin com connect qrconnect appid amp redirect uri amp

    2026年3月17日
    2
  • python基础串讲

    python基础串讲在 jupyter 中 ctrl enter 是执行该条语句 shift enter 是执行该条语句并且创建新的窗口 标识符以字母 数字 下划线组成 不能以数字开头 区分大小写 python3 支持中文符号 但是尽量不用 python 的保留字 不能用作常数或变数 只包含小写字母二进制 八进制 十六进制 输出时全部转化为十进制浮点数 复数 注释 单行用 多行用三个单引号或者双引号求余

    2026年3月17日
    2
  • String转换成json格式(二):org.codehaus.jettison.json.JSONObject

    String转换成json格式(二):org.codehaus.jettison.json.JSONObject实例 将 str 转换成 JSONObjct 格式 publicstatic String args Stringstr result success message 成功 JSONObjectjs try json newJSONObjec str System ou

    2026年3月17日
    1
  • C语言 sprintf函数使用详解

    C语言 sprintf函数使用详解srpintf()函数的功能非常强大:效率比一些字符串操作函数要高;而且更具灵活性;可以将想要的结果输出到指定的字符串中,也可作为缓冲区,而printf只能输出到命令行上~头文件:stdio.h函数功能:格式化字符串,将格式化的数据写入字符串中。函数原型:intsprintf(char*buffer,constchar*format,[argument]…)参数:…

    2022年6月22日
    48
  • 史上最强单片机科普,看完给跪了!

    史上最强单片机科普,看完给跪了!单片机出现的历史并不长 但发展十分迅猛 它的产生与发展和微处理器 CPU 的产生与发展大体同步 自 1971 年美国英特尔公司首先推出 4 位微处理器以来 它的发展到目前为止大致可分为 5 个阶段 下面以英特尔公司的单片机发展为代表加以介绍 1971 年 1976 年单片机发展的初级阶段 1971 年 11 月英特尔公司首先设计出集成度为 2000 只晶体管 片的 4 位微处理器英特尔 4004 并配有 RAM ROM 和移位寄存器 构成了第一台 MCS 4 微处理器 而后又推出了 8 位微处理器英特尔 8008 以及其它各公司相继推出

    2026年3月26日
    2
  • 数据库概念结构设计_数据库设计阶段分为

    数据库概念结构设计_数据库设计阶段分为概念结构设计:将需求分析得到的用户需求抽象为信息结构(即概念模型)的过程。一、概念模型在需求分析阶段所得到的应用需求应该首先抽象为信息世界的结构,然后才能更改、更准确地用某一数据库管理系统实现这些需求。概念模型的主要特点:1.能真实、充分地反映现实世界,包括事物和事物之间的联系,能满足用户对数据的处理要求,是现实世界的一个真是模型。2.易于理解,可以用它和不熟悉…

    2022年10月12日
    6

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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