0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

【GCC编译运行报错】error while loading

嵌入式物联网开发 来源:嵌入式物联网开发 作者:嵌入式物联网开发 2022-08-26 13:14 次阅读

运行编译后的程序报错 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

大概的意思就是在运行程序的时候,没有找到程序所需的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了。当然之前我们也已经验证了此方法的正确性。

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

如果仅仅又是重复介绍该方法,那么此文存在的意义就不大了。此文最大的意义在于,告诉读者,我们可以不用设置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”两者在功能是等价的。如下图所示:

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

​审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 嵌入式
    +关注

    关注

    5068

    文章

    19008

    浏览量

    302955
  • GCC
    GCC
    +关注

    关注

    0

    文章

    105

    浏览量

    24818
  • 编译
    +关注

    关注

    0

    文章

    652

    浏览量

    32800
收藏 人收藏

    评论

    相关推荐

    Linux 下GCC编译

    一、Linux 下多文件编译 在上一篇 Linux 下的 C 编程我们知道了 Linux 下的编译器为 GCC ,以及如何使用 GCC 进行编译
    的头像 发表于 09-11 15:18 2503次阅读
    Linux 下<b class='flag-5'>GCC</b>的<b class='flag-5'>编译</b>

    Error loading design # Error: Error loading design # Pausing macro ex...

    如图,quartus11.0 调用modelsim时候总是出现:Error loading design# Error: Error loading
    发表于 03-14 19:11

    modelsim仿真出错“Error loading design”

    最近不知为何,我的modelsim_ase在仿真时经常出现“Error loading design”的错误提示,但是代码编译是成功的。而且,每次重装之后就不会报错了。求教,这是怎么回
    发表于 07-29 20:55

    error loading design

    本帖最后由 小工兵 于 2015-8-23 13:57 编辑 最近用modelsim仿真工程时老是遇到报错error loading design ,而且无其他错误信息,设计的编译
    发表于 08-23 13:55

    gcc编译出错

    hello.c无法编译 编译如下3)fatal error: sys/cdefs.h No such file or directory解决方案 运行sudo apt-get upda
    发表于 04-01 07:45

    基于CM33核,GCC编译中嵌入汇编报错

    原有的工程是MDK下编译通过。现在使用GCC编译,代码中有调用__set_PRIMASK(0);结果使用GCC编译
    发表于 05-12 10:33

    为什么OKMX6UL-C板子直接执行编译好的qt程序会报错

    板子型号:OKMX6UL-C直接执行编译好的qt程序报错,或者打开/opt/qt4.8.5/apps/led 里面的led程序 报错报错内容:err
    发表于 01-07 07:25

    浅谈gcc编译

    3.3 gcc编译器 GNU CC(简称为gcc)是GNU项目中符合ANSI C标准的编译系统,能够编译用C、C++和Object C等语言
    发表于 10-18 13:48 0次下载

    如何在Keil MDK中使用GCC编译器工具链

    Keil MDK 是否支持编译器?有没有办法选择其他编译器? 可能你使用其他GUN工具链进行编译时,会出现类似如下错误: --- Error: cant execute as---
    的头像 发表于 11-20 15:53 4611次阅读

    "移植STM32F051,编译后遇到 #error ""Please select first the target STM32F0xx device used in your applicatio"

    报错如下编译报错如下解决办法编译报错如下.\Libraries\CMSIS\Device\ST\STM32F0xx\Include\stm3
    发表于 12-02 17:21 9次下载
    "移植STM32F051,<b class='flag-5'>编译</b>后遇到    #<b class='flag-5'>error</b> ""Please select first the target STM32F0xx device used in your applicatio"

    "STM32-MDK: Error: L6915E: Library reports error: __use_no_semihosting was requested,"

    编译程序是报错:…\OBJ\test_program.axf: Error: L6915E: Library reports error: __use_no_semihosting
    发表于 12-03 09:51 9次下载
    "STM32-MDK: <b class='flag-5'>Error</b>: L6915E: Library reports <b class='flag-5'>error</b>: __use_no_semihosting was requested,"

    IAR 报错报错Error[Pe020]: identifier “XXX“ is undefined

    报错Error[Pe020]: identifier “s” is undefined看上图,s肯定是已经定义了,为什么还会有这种报错。请小伙伴注意,如果这是c文件中声明的第一个函数,那么肯定是头文件出问题了。我这边回头查看头
    发表于 12-03 11:06 6次下载
    IAR <b class='flag-5'>报错</b><b class='flag-5'>报错</b>:<b class='flag-5'>Error</b>[Pe020]: identifier “XXX“ is undefined

    stm32 cubemx 添加 rt-thread 操作系统 context_gcc.S 编译报错

    stm32 cubemx 添加 rt-thread 操作系统 context_gcc.S 编译报错解决方法(eclipse+CDT 或 cubeide)解决方法(eclipse+CDT 或
    发表于 12-27 18:47 7次下载
    stm32 cubemx 添加 rt-thread 操作系统 context_<b class='flag-5'>gcc</b>.S <b class='flag-5'>编译</b><b class='flag-5'>报错</b>

    Keil MDK使用GCC编译器的方法

    有网友问:Keil 编译速度有点慢,它支持GCC编译吗?
    的头像 发表于 03-24 09:57 2967次阅读
    Keil MDK使用<b class='flag-5'>GCC</b><b class='flag-5'>编译</b>器的方法

    Linux使用gcc编译程序的语法

    01. 调试相关的宏 在Linux使用gcc编译程序的时候,对于调试的语句还具有一些特殊的语法。 gcc编译的过程中,会生成一些宏,可以使用这些宏分别打印当前源文件的信息,主要内容是当
    的头像 发表于 06-22 10:51 671次阅读