cevalokas

personal website

Not because they are easy, but because they are hard.


环境问题合集

目录

libGL:

p:

(base) cch@cch-virtual-machine:~/learn_pybullet$ /home/cch/anaconda3/envs/py39/bin/python /home/cch/learn_pybullet/hello_world.py
pybullet build time: Nov 28 2023 23:52:03
startThreads creating 1 threads.
starting thread 0
started thread 0 
argc=2
argv[0] = --unused
argv[1] = --start_demo_name=Physics Server
ExampleBrowserThreadFunc started
X11 functions dynamically loaded using dlopen/dlsym OK!
X11 functions dynamically loaded using dlopen/dlsym OK!
libGL error: MESA-LOADER: failed to open swrast: /usr/lib/dri/swrast_dri.so: cannot open shared object file: No such file or directory (search paths /usr/lib/x86_64-linux-gnu/dri:\$${ORIGIN}/dri:/usr/lib/dri, suffix _dri)
libGL error: failed to load driver: swrast
Creating context
Failed to create GL 3.3 context ... using old-style GLX context
Failed to create an OpenGL context

S:

export LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libstdc++.so.6

Why?:

export LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libstdc++.so.6 是一个用于在运行时强制加载指定共享库的环境变量设置。具体来说,它的作用如下:

1. 预加载指定的共享库

LD_PRELOAD 是一个环境变量,用于指定在程序执行之前预加载的共享库。通过设置 LD_PRELOAD,可以在程序启动时优先加载特定的共享库,而不是系统默认加载的库。这在解决依赖问题和库版本冲突时非常有用。

2. 指定的库

在这个命令中,/usr/lib/x86_64-linux-gnu/libstdc++.so.6 是指向 GNU 标准 C++ 库(libstdc++)的共享库文件。libstdc++ 是 GCC 编译器(GNU Compiler Collection)的一部分,为 C++ 程序提供标准库支持。

3. 作用

通过预加载 libstdc++.so.6,可以确保在运行某些依赖于特定版本 libstdc++ 的应用程序时,优先使用该版本的库。这对于解决由于不同版本的 libstdc++ 引起的兼容性问题非常有用。例如,如果某个应用程序需要 libstdc++.so.6 的特定版本,而系统默认加载的版本不符合要求,则可以通过设置 LD_PRELOAD 来强制使用所需版本。

具体例子

假设你有一个应用程序 myapp,在运行时需要特定版本的 libstdc++。你可以通过以下方式运行应用程序:

export LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libstdc++.so.6
./myapp

这样可以确保 myapp 启动时优先加载指定的 libstdc++ 版本,而不是系统默认版本。

总结

设置 LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libstdc++.so.6 的作用是强制在运行程序时优先加载指定的 libstdc++ 共享库。这对于解决库版本冲突和依赖问题非常有用,确保应用程序能够找到并使用正确版本的共享库。

.bashrc

fi

在 Bash 脚本中,fiif 语句的结束标志。Bash 使用 if 来判断条件,然后执行相应的代码块。fi 就是 if 的反转写法,表示 if 语句的结束。下面是一个简单的例子来展示 iffi 的使用:

#!/bin/bash

if [ -e /etc/passwd ]; then
    echo "The file /etc/passwd exists."
else
    echo "The file /etc/passwd does not exist."
fi

在这个例子中:

  • if [ -e /etc/passwd ]; then 判断 /etc/passwd 文件是否存在。
  • 如果条件为真,则执行 echo "The file /etc/passwd exists."
  • 如果条件为假,则执行 `echo “The file /etc/passwd does not exist

.”`

  • 最后用 fi 来结束 if 语句块。

在你提供的 .bashrc 文件中,fi 的用法如下:

if [ -z "${debian_chroot:-}" ] && [ -r /etc/debian_chroot ]; then
    debian_chroot=$(cat /etc/debian_chroot)
fi

这个 if 语句检查 debian_chroot 变量是否为空且 /etc/debian_chroot 文件是否可读。如果条件成立,则将 /etc/debian_chroot 文件的内容赋值给 debian_chroot 变量。这个 if 语句的结束用 fi 来表示。

再举一个例子:

if [ -n "$force_color_prompt" ]; then
    if [ -x /usr/bin/tput ] && tput setaf 1 >&/dev/null; then
        color_prompt=yes
    else
        color_prompt=
    fi
fi

这里有两个 if 语句,每个 if 块的结束都用 fi 标识。fi 的作用是标记条件语句的结束,以便脚本继续执行接下来的代码。

call

PowerShell 中的 CALL 命令无法使用的原因是因为 CALL 命令是批处理文件(Batch file)中的命令,而不是 PowerShell 的命令。PowerShell 有自己的一套命令和语法,不支持 CALL 命令。如果你想在 PowerShell 中运行脚本或调用命令,可以使用以下方法:

运行脚本文件

使用 . 符号或 & 运算符来运行脚本文件。例如:

# 使用点符号
. "C:\path\to\your\script.ps1"

# 使用 & 运算符
& "C:\path\to\your\script.ps1"

调用命令或可执行文件

直接输入命令或使用 & 运算符来调用可执行文件。例如:

# 直接输入命令
Get-Process

# 使用 & 运算符调用可执行文件
& "C:\Program Files\SomeApplication\app.exe"

使用 Start-Process 命令

如果需要以特定方式启动进程,可以使用 Start-Process 命令。例如:

Start-Process "notepad.exe"

使用 Invoke-Command

如果需要在远程计算机上执行命令,可以使用 Invoke-Command。例如:

Invoke-Command -ComputerName RemoteComputer -ScriptBlock { Get-Process }

通过这些方法,你可以在 PowerShell 中执行脚本或调用命令,而无需使用 CALL 命令。