[software development] cargo not found
Tofloor
poster avatar
guyuming
deepin
2025-07-17 18:44
Author

我使用 apt install rustc 安装了rust;

完了 运行 cargo 报 cargo not found

如何正确安装rust和cargo?

我使用的版本是 deepin 23 社区版

Reply Favorite View the author
All Replies
天空之城Top
deepin
2025-07-17 18:58
#1

curl --proto '=https' --tlsv1.2 https://sh.rustup.rs -sSf | sh

Reply View the author
raspbian
deepin
2025-07-17 19:19
#2

首先安装一个正常的docker engine 不要安装apt库里那个

然后新建一个rust容器

services:
  rust:
    image: rust:alpine3.20
    container_name: rust
    restart: unless-stopped
    volumes:
      - ./:/workpalce
    command: ash
    tty: true
    stdin_open: true

然后进入容器 docker exec -it rust ash

输入命令 sed -i 's#https\?://dl-cdn.alpinelinux.org/alpine#http://mirrors4.tuna.tsinghua.edu.cn/alpine#g' /etc/apk/repositories
更换alpine源
根据帮助文件更换Cargo源

最后开始写你的代码


另外给你一个经验之谈 无论你用什么编程工具 用包管理器安装应该是你最终不得不选择的一个备用方案 而不是首选

Reply View the author
我是昵称
deepin
2025-07-17 19:29
#3

https://www.rust-lang.org/zh-CN/tools/install

Reply View the author
天空之城Top
deepin
2025-07-17 19:35
#4

https://course.rs/first-try/installation.html

Reply View the author
把一切操作变成GUI
deepin
Backbone of ecological co-construction group
2025-07-17 19:49
#5

一条命令装完:curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

所有工具都安装在 ~/.cargo/bin 目录中,您可以在这里找到包括 rustccargorustup 在内的 Rust 工具链。

Reply View the author
guyuming
deepin
2025-07-17 21:01
#6
guyuming@guyuming-acer:/rfm1$ sudo make clean
请输入密码:
验证成功
cleaning
Cleaning reedline_wrapper...
/bin/sh: 1: cargo: not found
make: *** [Makefile:130:clean] 错误 127
guyuming@guyuming-acer:/rfm1$ make clean
cleaning
Cleaning reedline_wrapper...
error: failed to remove file ​/home/guyuming/rfm1/reedline_wrapper/target/debug/incremental/reedline_wrapper-0o3cjxhsyo096/s-h9atb19yqj-054sef7-e8umut05sm10vbpblxl3nybaw/47udyheaeadr79x556f8346ol.o​Caused by:
Permission denied (os error 13)
make: *** [Makefile:130:clean] 错误 101
guyuming@guyuming-acer:~/rfm1$ sudo su
root@guyuming-acer:/home/guyuming/rfm1# make clean
cleaning
Cleaning reedline_wrapper...
Removed 431 files, 170.8MiB total
root@guyuming-acer:/home/guyuming/rfm1#

这是为啥?sudo 就不行

Reply View the author
把一切操作变成GUI
deepin
Backbone of ecological co-construction group
2025-07-17 22:13
#7
guyuming
guyuming@guyuming-acer:/rfm1$ sudo make clean
请输入密码:
验证成功
cleaning
Cleaning reedline_wrapper...
/bin/sh: 1: cargo: not found
make: *** [Makefile:130:clean] 错误 127
guyuming@guyuming-acer:/rfm1$ make clean
cleaning
Cleaning reedline_wrapper...
error: failed to remove file ​/home/guyuming/rfm1/reedline_wrapper/target/debug/incremental/reedline_wrapper-0o3cjxhsyo096/s-h9atb19yqj-054sef7-e8umut05sm10vbpblxl3nybaw/47udyheaeadr79x556f8346ol.o​Caused by:
Permission denied (os error 13)
make: *** [Makefile:130:clean] 错误 101
guyuming@guyuming-acer:~/rfm1$ sudo su
root@guyuming-acer:/home/guyuming/rfm1# make clean
cleaning
Cleaning reedline_wrapper...
Removed 431 files, 170.8MiB total
root@guyuming-acer:/home/guyuming/rfm1#

这是为啥?sudo 就不行

不是,你操作了什么?为什么要这么操作?

Reply View the author
SkyShadowHero
deepin
2025-07-18 07:36
#8

我安装完cargo后要手动改一下环境路径,输入安装指令安装cargo

时它应该会提醒手动改路径的

Reply View the author
guyuming
deepin
2025-07-18 08:49
#9

我问了deepseek,回答如下,然后我相应改了Makefile, make install 不依赖all规则,sudo make install 就不再执行编译了,make clean 也就无需 sudo 了


为啥 sudo su 以后cargo 就能找到,而sudo 执行命令就找不到cargo

这个问题涉及到 Linux 的 sudosudo su 的环境变量(PATH)差异,具体原因如下:


1. sudosudo su 的环境变量差异

  • sudo
    当直接使用 sudo command 时,出于安全考虑,sudo 会重置环境变量(包括 PATH),只保留一些基本的、安全的路径(如 /usr/bin/bin 等)。
    如果 cargo 安装在用户目录(如 ~/.cargo/bin),这个路径 不会 包含在 sudo 的默认 PATH 里,因此会报错 cargo: not found
  • sudo su
    当运行 sudo su 切换到 root 时,默认会加载 root 用户的完整环境(包括 root 的 PATH)。
    如果 cargo 是通过系统包管理器(如 apt)安装的,或者 root 用户手动配置了 PATH(比如在 ~/.bashrc/etc/environment 中添加了 ~/.cargo/bin),那么 cargo 就能被找到。

2. 如何验证?

(1) 查看 sudosudo suPATH

bash

复制

下载

# 查看 sudo 的 PATH
sudo sh -c 'echo $PATH'

# 查看 sudo su 的 PATH
sudo su -c 'echo $PATH'

你会发现 sudoPATHsudo suPATH 更短,可能缺少 ~/.cargo/bin

(2) 检查 cargo 的安装位置

bash

复制

下载

which cargo       # 普通用户的 cargo 路径(通常是 ~/.cargo/bin/cargo)
sudo which cargo  # sudo 找不到 cargo
sudo su -c 'which cargo'  # 如果是 root 用户安装的,可能会找到

3. 解决方案

(1) 让 sudo 也能找到 cargo

  • 方法 1:使用 sudo -E(保留当前用户的环境变量)
    bash

    复制

    下载

    sudo -E make clean
    

    但这种方法可能不安全,因为会继承普通用户的所有环境变量。

  • 方法 2:修改 sudosecure_path
    编辑 /etc/sudoers(使用 visudo):
    bash

    复制

    下载

    sudo visudo
    

    找到 Defaults secure_path="...",并在其中添加 ~/.cargo/bin(例如):
    text

    复制

    下载

    Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin:/home/YOUR_USER/.cargo/bin"
    

    然后保存退出。

(2) 用 sudo env PATH=$PATH make clean

临时让 sudo 使用当前用户的 PATH

bash

复制

下载

sudo env PATH=$PATH make clean

这样 sudo 就能找到 cargo 了。

(3) 用 cargo clean 代替 make clean(推荐)

如果 make clean 只是调用 cargo clean,你可以直接用:

bash

复制

下载

cargo clean

避免 sudo 权限问题。


4. 为什么 make clean 需要 sudo

通常 cargo clean 不需要 sudo,但你的报错:

text

复制

下载

error: failed to remove file ... Permission denied (os error 13)

说明 target/ 目录的权限可能被错误地修改过(比如之前用 sudo 编译过)。
正确的做法是修复权限,而不是依赖 sudo

bash

复制

下载

# 递归修改 target/ 目录的权限,让当前用户可读写
sudo chown -R $USER:$USER reedline_wrapper/target/

之后就可以用普通用户运行 make cleancargo clean,不再需要 sudo


总结

  • sudo 找不到 cargo 是因为它默认使用受限的 PATH,而 sudo su 会加载完整的 root 环境。
  • 最佳实践
    1. 不要用 sudo 运行 cargo(Rust 工具链应该以普通用户运行)。
    2. 修复 target/ 目录的权限,避免 Permission denied
    3. 如果必须用 sudo,可以用 sudo env PATH=$PATH make clean 临时继承当前 PATH
Reply View the author
kero990
deepin
2025-07-18 12:10
#10

cargo有单独的软件包,就叫cargo,你可以尝试使用apt install cargo

当然了,楼上说的是对的,没事别用包管理器的开发环境。但是楼上那个官方rust在国内的速度极其感人,每个库都要从中心仓库或者github拉,基本上一个你也拉不下来。

建议使用镜像https://rsproxy.cn/

Reply View the author
redeagle
deepin
a day ago
#11

cargo: /usr/bin/cargo

Reply View the author
把一切操作变成GUI
deepin
Backbone of ecological co-construction group
a day ago
#12
guyuming

我问了deepseek,回答如下,然后我相应改了Makefile, make install 不依赖all规则,sudo make install 就不再执行编译了,make clean 也就无需 sudo 了


为啥 sudo su 以后cargo 就能找到,而sudo 执行命令就找不到cargo

这个问题涉及到 Linux 的 sudosudo su 的环境变量(PATH)差异,具体原因如下:


1. sudosudo su 的环境变量差异

  • sudo
    当直接使用 sudo command 时,出于安全考虑,sudo 会重置环境变量(包括 PATH),只保留一些基本的、安全的路径(如 /usr/bin/bin 等)。
    如果 cargo 安装在用户目录(如 ~/.cargo/bin),这个路径 不会 包含在 sudo 的默认 PATH 里,因此会报错 cargo: not found
  • sudo su
    当运行 sudo su 切换到 root 时,默认会加载 root 用户的完整环境(包括 root 的 PATH)。
    如果 cargo 是通过系统包管理器(如 apt)安装的,或者 root 用户手动配置了 PATH(比如在 ~/.bashrc/etc/environment 中添加了 ~/.cargo/bin),那么 cargo 就能被找到。

2. 如何验证?

(1) 查看 sudosudo suPATH

bash

复制

下载

# 查看 sudo 的 PATH
sudo sh -c 'echo $PATH'

# 查看 sudo su 的 PATH
sudo su -c 'echo $PATH'

你会发现 sudoPATHsudo suPATH 更短,可能缺少 ~/.cargo/bin

(2) 检查 cargo 的安装位置

bash

复制

下载

which cargo       # 普通用户的 cargo 路径(通常是 ~/.cargo/bin/cargo)
sudo which cargo  # sudo 找不到 cargo
sudo su -c 'which cargo'  # 如果是 root 用户安装的,可能会找到

3. 解决方案

(1) 让 sudo 也能找到 cargo

  • 方法 1:使用 sudo -E(保留当前用户的环境变量)
    bash

    复制

    下载

    sudo -E make clean
    

    但这种方法可能不安全,因为会继承普通用户的所有环境变量。

  • 方法 2:修改 sudosecure_path
    编辑 /etc/sudoers(使用 visudo):
    bash

    复制

    下载

    sudo visudo
    

    找到 Defaults secure_path="...",并在其中添加 ~/.cargo/bin(例如):
    text

    复制

    下载

    Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin:/home/YOUR_USER/.cargo/bin"
    

    然后保存退出。

(2) 用 sudo env PATH=$PATH make clean

临时让 sudo 使用当前用户的 PATH

bash

复制

下载

sudo env PATH=$PATH make clean

这样 sudo 就能找到 cargo 了。

(3) 用 cargo clean 代替 make clean(推荐)

如果 make clean 只是调用 cargo clean,你可以直接用:

bash

复制

下载

cargo clean

避免 sudo 权限问题。


4. 为什么 make clean 需要 sudo

通常 cargo clean 不需要 sudo,但你的报错:

text

复制

下载

error: failed to remove file ... Permission denied (os error 13)

说明 target/ 目录的权限可能被错误地修改过(比如之前用 sudo 编译过)。
正确的做法是修复权限,而不是依赖 sudo

bash

复制

下载

# 递归修改 target/ 目录的权限,让当前用户可读写
sudo chown -R $USER:$USER reedline_wrapper/target/

之后就可以用普通用户运行 make cleancargo clean,不再需要 sudo


总结

  • sudo 找不到 cargo 是因为它默认使用受限的 PATH,而 sudo su 会加载完整的 root 环境。
  • 最佳实践
    1. 不要用 sudo 运行 cargo(Rust 工具链应该以普通用户运行)。
    2. 修复 target/ 目录的权限,避免 Permission denied
    3. 如果必须用 sudo,可以用 sudo env PATH=$PATH make clean 临时继承当前 PATH

不明白你为什么要搞这么复杂,在.bashrc文件里面添加cargo程序所在的路径到PATH变量不久完事了吗

Reply View the author