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

大概的意思就是在运行程序的时候,没有找到程序所需的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编译动态库和运行链接动态库的知识。http://www.cnblogs.com/zhengmeifu/archive/2010/03/02/linux-gcc_compile_header_file_and_lib_path.html
回到可执行程序运行报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 使用中常用的参数及命令http://www.cnblogs.com/Recan/p/6012248.html 去了解。
这里,我们需要用到的编译选项是-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参数得是正确的。这个方法,尤其是在交叉编译嵌入式设备的可执行程序时,十分有用。不妨读者可以自己试试看。
运行编译后的程序报错 error while loading shared libraries: lib*.so: cannot open shared object file: No such file or directory的更多相关文章
- linux使用wkhtmltopdf报错error while loading shared libraries:
官网提示 linux需要这些动态库.depends on: zlib, fontconfig, freetype, X11 libs (libX11, libXext, libXrender) 在li ...
- 使用arm-none-eabi-gdb报错error while loading shared libraries: libncurses.so.5: cannot open shared object file: No such file or directory
使用arm-none-eabi-gdb报错error while loading shared libraries: libncurses.so.5: cannot open shared objec ...
- 解决Android Studio编译后安装apk报错:Error while Installing APK
刚开始玩 Android ,用Android studio 连接真机做测试,在虚拟机上没有问题,但是真机就会报错 检查了好多地方,最终发现了问题,网上的常规就不介绍了,大家自己去看别的帖子 手机方面 ...
- 我的Android进阶之旅------>解决Android Studio编译后安装apk报错:The APK file does not exist on disk
1.错误描述 今天用Android Studio编译应用后安装APK的时候,报错了,错误如下所示: The APK file build\outputs\apk\OYP_2.3.4_I2Base_64 ...
- 用命令提示符运行简单的Java程序报错
首先用记事本写一个最简单的Java代码,我把文件保存在桌面的HelloWorld文件夹中,这里将记事本的名称改为HelloWorld.java public class HelloWorld{ pub ...
- 10gRAC运行srvctl报错error while loading shared libraries:
数据库10g才会有这个错,因为11g的grid和oracle是分开的. [oracle@news01 orcl]$ srvctl /u01/app/oracle/db_1/jdk/jre/bin/ja ...
- 编译sass,遇到报错error style.scss (Line 3: Invalid GBK character "\xE5")
今天学习sass,写了一行中文注释,结果却遇到了报错: cmd.exe /D /C call C:/Ruby23-x64/bin/scss.bat --no-cache --update style. ...
- 【samtools】运行报错: error while loading shared libraries:libcrypto.so.1.0.0或libncurses.so.5或libtinfow.so.5
samtools用conda安装后,总是出现共享库缺失的报错.即便你刚安装samtools时可以用,但后面在同一环境中安装其他相关软件,有可能产生了冲突,导致库替换,因而报错. 避免这种情况,可能最好 ...
- nuxt 运行项目后 中总是报错
报错的内容: nuxt.config.js中的图片 如果出现第一张图的中的错误: 请注释掉第二张图中extend里面的loader:'eslit-loader',或者把extend里面if下面的内容全 ...
随机推荐
- access数据库多个left join示例
代码: /// <summary> /// 分类检索 查询selectname /// </summary> public static DataTable GetSelect ...
- 设计模式--原型(Prototype)模式
写这些也许有人认为“为了模式而模式”.Insus.NET所想到的,每个大师成为大师之前,也许都得这样做. 走路,从小就开始学,直至现在,谁还不是为了走路而走路?一直重复着...... 很多人没有分享自 ...
- 使用BOM 的window对象属性打开新窗口
★ 示例1 要求:弹出新窗口,并向新窗口写入动态HTML代码 代码 <buttononclick="btnOpen()">打开新窗口</button> & ...
- JS代码放置位置、变量与数据类型、运算符与逻辑表达运算符
内容简要: 1.JS代码放置位置的问题: 2.变量与数据类型: 3.运算符与逻辑表达式的运算符 我的位置 全局问题:为何在网页推荐位置(一般在<head></head>内部 ...
- IDEA默认常用快捷键
作为Java的利器,IDEA属实是非常好用,参考网文总结其常用快捷键如下: Ctrl + /(Ctrl + Shift + /):注释或反注释指定的语句.这个是本人最喜欢的,所以排在第一位. Ctrl ...
- 2 Orchard汉化资源包的使用
Orchard安装完毕之后我们就可以在后台尝试做一些基本的操作感受下Orchard提供的一些功能,比如添加一个页面.菜单.文章什么的.也可以试着新建一些部件.布局之类的感受下.个人建议摆弄一下了解下就 ...
- Mongoose 框架初学使用记录
嘛.... 最近由于需要使用HTTP服务端,原先是使用的Qt框架实现的HTTP服务端,然后发现有些缺陷导致我不得不放弃这个框架,也不是完全放弃,只是HTTP服务端这里不再使用Qt,用Qt做高并发真的有 ...
- python pip 升级每个包
pip本身不自带升级所有包的功能, 但可以通过下面的脚本实现. import pip from subprocess import call for dist in pip.get_installed ...
- CodeForces 149D Coloring Brackets
Coloring Brackets time limit per test: 2 seconds memory limit per test: 256 megabytes input: standar ...
- 硅谷新闻1--引导界面GuideActivity
1.红点切换间距 RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) iv_red_point.getLayoutPa ...