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参数得是正确的。这个方法,尤其是在交叉编译嵌入式设备的可执行程序时,十分有用。不妨读者可以自己试试看。

​审核编辑:汤梓红

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

    关注

    4983

    文章

    18295

    浏览量

    288594
  • GCC
    GCC
    +关注

    关注

    0

    文章

    104

    浏览量

    24717
  • 编译
    +关注

    关注

    0

    文章

    615

    浏览量

    32397
收藏 人收藏

    评论

    相关推荐

    Linux 下GCC编译

    一、Linux 下多文件编译 在上一篇 Linux 下的 C 编程我们知道了 Linux 下的编译器为 GCC ,以及如何使用 GCC 进行编译
    的头像 发表于 09-11 15:18 1089次阅读
    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

    编译显示fatal error: stdio.h: No such file or directory怎么解决?

    编译通过命令arm-poky-linux-gnueabi-gcc test.c,编译程序时,显示fatal error: stdio.h: No such file or direc
    发表于 01-10 06:35

    cubemx生成的main.c报错怎么解决

    之前可以编译成功,但是开启软件i2c后编译报错。我使用git将工程还原后重新编译仍然报错,不知道是哪里出了问题,因为main.c文件我没有修
    发表于 04-24 09:28

    浅谈gcc编译

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

    Linux下C/C++编译gcc使用指南

    1.gcc包含的c/c++编译gcc,cc与c++,g++ gcc和cc是一样的,c++和g++是一样的。一般c程序就用gcc
    发表于 11-02 10:59 0次下载

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

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

    "移植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,"

    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>