请教:普通用户可执行,sudo 执行却报错error while loading shared libraries

cs十七 2017-12-14 09:34:31
编写的程序 ./SerialFlowTest
在普通用户下可以运行,但是因为要open串口,所以使用 sudo ./SerialFlowTest,结果此时会报错。
error while loading shared libraries: libcJSON.so.1: cannot open shared object file: No such file or directory
1.1程序使用QtCreator生成


1.2.程序目录如下:


2.在普通用户下可以执行


3.使用sudo却报错。


4.找资料时找到这个网页,
4.1 使用在sudo gedit /etc/ld.so.conf 文件中加入这个目录,就成功了。
4.2 但是 使用 export 的方式却不成功,修改 .bashrc的方式也不成功。


5.问题,请教一下:
5.1 既然在普通用户下可以执行,那为什么 sudo却不能执行,是有什么原理吗?
5.2 理解,既然链接库 与 执行程序都在同一个目录下,那应该能够正常执行才对啊?
5.3奇怪为什么 4.1可以成功,4.2却不能成功?
5.4奇怪,为什么另一个库libcomlib却不会报这个错误呢??


6.问题排查
6.1使用 ldd 命令查看程序涉及的链接库。普通用户下能够找到,使用sudo却找不到,为什么??

-------
我的积分好少啊,得赚啊
...全文
1596 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
jasonM2008 2017-12-18
  • 打赏
  • 举报
回复
解决了,就来那份咯。。。。
cs十七 2017-12-17
  • 打赏
  • 举报
回复
小结: 3.应该还有一些东西需要了解的, 2.在普通用户下,设置了 export LD_LIBRARY_PATH=共享库的目录都可以执行后在普通用户下执行,对 sudo ./xxx 不行。在root用户下设置此变量后,在root用户下执行。 1.应用程序中使用共享库的方法,可以参考: (1)Shared libraries with GCC on Linux - Cprogramming.com https://www.cprogramming.com/tutorial/shared-libraries-linux-gcc.html (2)GNU Scientific Library – Reference Manual: Shared Libraries http://www.gnu.org/software/gsl/manual/html_node/Shared-Libraries.html
cs十七 2017-12-17
  • 打赏
  • 举报
回复
引用 4 楼 zhxianbin 的回复:
不同用户环境变量是不同的 ,分别看一下 $LD_LIBRARY_PATH
嗯,这个明白。 测试过了,不管普通用户或者root用户,只要设置了export LD_LIBRARY_PATH=共享库的目录都可以执行。
zhxianbin 2017-12-15
  • 打赏
  • 举报
回复
不同用户环境变量是不同的 ,分别看一下 $LD_LIBRARY_PATH
cs十七 2017-12-15
  • 打赏
  • 举报
回复
引用 2 楼 r_Jimy 的回复:
你不要sudo ./xxx执行 sudo su为root后,再执行看看 是不是你哪里有export LD_LIBRARY_PATH了呢
谢! 嗯,是的。 $su root $export LD_LIBRARY_PATH=共享库的目录 $./ProgName 之后可以正常执行了。
常书 2017-12-15
  • 打赏
  • 举报
回复
你不要sudo ./xxx执行 sudo su为root后,再执行看看 是不是你哪里有export LD_LIBRARY_PATH了呢
cs十七 2017-12-15
  • 打赏
  • 举报
回复
好像知道怎么解决了。 1. 普通用户下的 终端中 export LD_LIBRARY_PATH 在sudo执行时是没有的 man sudo ### sudo, sudoedit — execute a command as another user 那实际上 sudo ./ProgName 执行时候是以另一个用户身份执行。 如果只是在当前普通用户下的 终端中 执行 export LD_LIBRARY_PATH=共享库的位置,只是在当前用户下有了 $LD_LIBRARY_PATH这个变量,但是使用sudo的时候,是没有这个变量的。 资料参考: linux使用gcc编译c语言共享库步骤 http://www.jb51.net/article/46005.htm 问题:但是也还是有疑问 1.为什么 直接普通用户时候 执行 ./ProgName可以执行,而且不需要 设置其他环境变量, 这里是有什么原因吗?
Re: 《用户管理及用户信息查询命令》 ---------------------------------------内容提要: 01/19)命令useradd   :创建用户02/19)命令usermod :修改用户信息03/19)命令userdel    :删除用户04/19)命令groupadd:创建新组05/19)命令groupdel :删除用户组06/19)命令passwd    :修改用户密码07/19)命令chage      :修改用户密码有效期08/19)命令chpasswd:批量更新用户密码09/19)命令su            :切换用户10/19)命令visudo     :编辑sudoers文件11/19)命令sudo        :以另一个用户身份执行命令12/19)命令id             :显示用户与用户组的信息13/19)命令w             :显示已登录用户信息14/19)命令who          : 显示已登录用户信息15/19)命令users       :显示已登录用户16/19)命令whoami    : 显示当前登录的用户名17/19)命令last          :显示用户登录列表18/19)命令lastb         : 显示用户登录失败的记录19/19)命令lastlog      : 显示所有用户的最近登录记录  本人在教学和实战过程中发现,即便是有一定运维经验的人,可能已经能够搭建一定复杂度的Linux架构,但是在来来回回的具体操作中,还是体现出CLI(命令界面)功底不够扎实,甚至操作的非常‘拙’、处处露‘怯’。 对一个士兵来说,枪就是他的武器,对于一个程序员来说,各种library(工具库)就是他的武器;而对于Linux运维人员来说,无疑命令行工具CLI(命令界面)就是他们的武器;高手和小白之间的差距往往就体现在对于这些“武器”的掌握和熟练程度上。有时候一个参数就能够解决的事情,小白们可能要写一个复杂的Shell脚本才能搞定,这就是对CLI(命令界面)没有理解参悟透彻导致。 研磨每一个命令就是擦拭手中的作战武器,平时不保养不理解,等到作战的时候,一定不能够将手中的武器发挥到最好,所以我们要平心、静气和专注,甘坐冷板凳一段时间,才能练就一身非凡的内功! 本教程从实战出发,结合当下流行或最新的Linux(v6/7/8 版本)同时演示,将命令行结合到解决企业实战问题中来,体现出教学注重实战的务实精神,希望从事或未来从事运维的同学,能够认真仔细的学完Linux核心命令的整套课程。 本课程系列将逐步推出,看看我教学的进度和您学习的步伐,孰占鳌头! 注:关于教学环境搭建,可以参考本人其它课程系列,本教学中就不再赘述! 《参透 VMware 桌面级虚拟化》 《在虚拟机中安装模版机(包括应用软件等)》 《SecureCRT 连接 GNS3/Linux 的安全精密工具》 

23,110

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧