LD_LIBRARY_PATH的错误

本文描述了一种在Apache服务器上部署WSGI应用时遇到的cannotfindso错误,并详细记录了解决该问题的过程。作者发现该错误源于第三方驱动程序在非标准路径下安装,导致Apache无法加载所需的.so文件。通过调整Apache的运行端口最终解决了这一问题。

         这几天在部署系统时又碰到了can not find so的错误了,本来以为这个问题是小意思一个,手到擒来,结果还是花了我半天的时间才搞定。

         这个问题是这样的:我在一台apache上部署了一个wsgi应用,python脚本里用到了一个第三方的驱动程序,这个python的驱动包不是我安装的,是其他人员安装在非标准目录下的。我在shell命令中使用这个第三方驱动包没有问题,但是在apache中调用python脚本时却找不到驱动的so文件。

         一般来说看这篇文章Linux 共享库:LD_LIBRARY_PATH 与ld.so.conf基本上就能搞定所有的LD_LIBRARY_PATH的问题。具体到这个问题,我们也能分析出来,首先是本地环境变量传递给Apache,然后Apache传递给wsgi,wsgi再传递给python包。整个链条就串起来了,就能找到动态库了。环境变量传递给Apache可以使用export来做。Apache传递给wsgi,本来以为可以使用SetEnv这个命令来处理,结果仔细看文档,发现不行,这个Env只是apache用的。而在python脚本中也没有可以用来修改环境变量的命令,os.environ这个变量不能用来设置环境变量。事情到了这里进行不下去了。

         还在天无绝人之路,有仔细阅读了一下这几篇文章,发现这一行:For security reasons, LD_LIBRARY_PATH is ignored at runtime forexecutables that have their setuid or setgid bit set. This severely limits theusefulness of LD_LIBRARY_PATH.原来在setuid的情况下,LD_LIBRARY_PATH不起作用。我的Apache是启在80端口上的,这样这个问题就无解了。最后我只有采用将apache启在8080端口上才解决了这个这个问题。当然如果有root权限,这个问题是很好解决的,在系统目录下建一个软连接就行了。


### LD_LIBRARY_PATH=$dirname:$LD_LIBRARY_PATH 和 export LD_LIBRARY_PATH 的作用 `LD_LIBRARY_PATH` 是一个环境变量,用于指定系统在运行时搜索共享库(`.so` 文件)的路径。当程序运行时需要加载共享库,系统会在 `LD_LIBRARY_PATH` 指定的路径中查找这些库。 `LD_LIBRARY_PATH=$dirname:$LD_LIBRARY_PATH` 的作用是将 `$dirname` 所代表的目录添加到 `LD_LIBRARY_PATH` 环境变量的前面。这样,系统在搜索共享库时会优先在 `$dirname` 目录中查找,然后再去 `LD_LIBRARY_PATH` 中其他已有的目录查找。`$dirname` 通常代表当前脚本所在的目录或者某个特定的目录。 `export LD_LIBRARY_PATH` 用于将 `LD_LIBRARY_PATH` 环境变量导出,使其对当前 shell 及其子进程可见。通过 `export` 添加的环境变量仅针对当前运行 shell 生效,退出后被重置,而且重新启动的 shell 也不会继承[^2]。 ### 可能出现 signal 11 错误的解决办法 在 CoppeliaSim 运行时,signal 11 错误通常表示段错误,可能是由于运行时库路径设置问题导致程序无法正确加载所需的共享库。以下是一些可能的解决办法: #### 1. 临时设置 `LD_LIBRARY_PATH` 可以在运行 CoppeliaSim 之前,临时设置 `LD_LIBRARY_PATH` 环境变量,确保系统能够找到所需的共享库。例如: ```bash LD_LIBRARY_PATH=/path/to/coppeliasim/lib:$LD_LIBRARY_PATH export LD_LIBRARY_PATH ./coppeliasim.sh ``` 这里 `/path/to/coppeliasim/lib` 是 CoppeliaSim 共享库所在的目录。 #### 2. 修改 `coppeliasim.sh` 文件 在 `coppeliasim.sh` 文件中设置 `LD_LIBRARY_PATH` 环境变量。可以在文件开头添加以下代码: ```bash #!/bin/bash # 得到当前输入参数的父级路径 PARAMETER_PATH=`dirname $0` # 设置 LD_LIBRARY_PATH LD_LIBRARY_PATH=$PARAMETER_PATH:$LD_LIBRARY_PATH export LD_LIBRARY_PATH ``` 这样,每次运行 `coppeliasim.sh` 脚本时,都会自动设置正确的 `LD_LIBRARY_PATH`。 #### 3. 检查库文件是否存在 确保 CoppeliaSim 所需的共享库文件存在于指定的目录中。可以使用 `ls` 命令检查: ```bash ls /path/to/coppeliasim/lib ``` 如果某些库文件缺失,可能需要重新安装 CoppeliaSim 或者检查安装过程中是否出现问题。 #### 4. 避免版本冲突 如之前提到的,CoppeliaSim 自带了适配的 Qt 版本,安装的 Qt 版本可能与 CoppeliaSim 自带的 Qt 库版本不同,导致版本不兼容无法执行。可以在 `coppeliasim.sh` 中删除 `LD_LIBRARY_PATH` 路径,只留下目录路径,以确保使用的是 CoppeliaSim 自带的适配 Qt 版本。 ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值