在 sudo 中加载共享库时出错

spl*_*ode 1 c++ unix linker

我阅读了https://github.com/openyou/libomron/blob/master/README.asciidoc上的文档

执行:

cd /
sudo find . | grep libomron.so.0.9.0
Run Code Online (Sandbox Code Playgroud)

结果:

./home/splincode/Develop/omron/c++_modules/libomron/omron-build/lib/
Run Code Online (Sandbox Code Playgroud)

好的,我在全局路径中添加库

LD_LIBRARY_PATH=/usr/local/lib
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/splincode/Develop/omron/c++_modules/libomron/omron-build/lib/
export LD_LIBRARY_PATH
Run Code Online (Sandbox Code Playgroud)

然后就是工作了:

 cd ~/Develop/omron/usr/local/bin/
 ./omron_790IT_test
Run Code Online (Sandbox Code Playgroud)

但是,不能在硬件中访问,结果

 Found 1 omron 790ITs
 Cannot open omron 790IT!
Run Code Online (Sandbox Code Playgroud)

结果我开始以管理员身份运行,却看不到该库,怎么办?

sudo ./omron_790IT_test
Run Code Online (Sandbox Code Playgroud)

结果:

 ./omron_790IT_test: error while loading shared libraries: libomron.so.0.9.0: cannot open shared object file: No such file or directory
Run Code Online (Sandbox Code Playgroud)

Emp*_*ian 5

./omron_790IT_test: error while loading shared libraries

发生这种情况是因为默认情况下sudo传播环境变量;这样做会带来安全风险。

您可以通过以下三种方式之一来处理此问题:

  1. 以不需要LD_LIBRARY_PATH设置的方式链接您的程序(这是最好的方法)。

    在您的情况下,链接命令应如下所示:

    gcc -o omron_790IT_test ... \ -Wl,-rpath=/home/splincode/Develop/omron/c++_modules/libomron/omron-build/lib

  2. 在 sudo 进程中显式设置所需的环境变量:

    sudo env LD_LIBRARY_PATH=... ./omron_790IT_test

  3. 要求sudo将所有环境变量传播到根进程中:

    sudo -E ./omron_790IT_test

    sudo --preserve-env ./omron_790IT_test