c - 如何在 WSL2 上正确安装 perf 命令
问题描述
我在 WSL2 ubuntu 中的机器上编译 perf 时遇到问题。
Ubuntu是从微软商店下载的,内核版本是4.19.128-microsoft-standard
我已经在 stackoverflow 上关注了这个答案,而且https://blog.haoxp.xyz/posts/wsl2-perf/
运行 make 时出现以下错误:
mv: cannot stat 'util/.env.o.tmp': No such file or directory
make[4]: *** [/mnt/c/Users/micro/Documents/tools/WSL2-Linux-Kernel/tools/build/Makefile.build:97: util/env.o] Error 1
make[4]: *** Waiting for unfinished jobs....
LD bench/perf-in.o
make[3]: *** [/mnt/c/Users/micro/Documents/tools/WSL2-Linux-Kernel/tools/build/Makefile.build:139: util] Error 2
make[2]: *** [Makefile.perf:633: libperf-in.o] Error 2
make[2]: *** Waiting for unfinished jobs....
ld: bench/futex-lock-pi.o:/mnt/c/Users/micro/Documents/tools/WSL2-Linux-Kernel/tools/perf/bench/futex-lock-pi.c:38: multiple definition of `end'; bench/futex-hash.o:/mnt/c/Users/micro/Documents/tools/WSL2-Linux-Kernel/tools/perf/bench/futex-hash.c:38: first defined here
ld: bench/futex-lock-pi.o:/mnt/c/Users/micro/Documents/tools/WSL2-Linux-Kernel/tools/perf/bench/futex-lock-pi.c:38: multiple definition of `start'; bench/futex-hash.o:/mnt/c/Users/micro/Documents/tools/WSL2-Linux-Kernel/tools/perf/bench/futex-hash.c:38: first defined here
ld: bench/futex-lock-pi.o:/mnt/c/Users/micro/Documents/tools/WSL2-Linux-Kernel/tools/perf/bench/futex-lock-pi.c:38: multiple definition of `runtime'; bench/futex-hash.o:/mnt/c/Users/micro/Documents/tools/WSL2-Linux-Kernel/tools/perf/bench/futex-hash.c:38: first defined here
make[4]: *** [/mnt/c/Users/micro/Documents/tools/WSL2-Linux-Kernel/tools/build/Makefile.build:145: bench/perf-in.o] Error 1
make[3]: *** [/mnt/c/Users/micro/Documents/tools/WSL2-Linux-Kernel/tools/build/Makefile.build:139: bench] Error 2
make[3]: *** Waiting for unfinished jobs....
LD tests/perf-in.o
ld: tests/bp_account.o:/mnt/c/Users/micro/Documents/tools/WSL2-Linux-Kernel/tools/perf/tests/bp_account.c:25: multiple definition of `the_var'; tests/bp_signal.o:/mnt/c/Users/micro/Documents/tools/WSL2-Linux-Kernel/tools/perf/tests/bp_signal.c:37: first defined here
make[4]: *** [/mnt/c/Users/micro/Documents/tools/WSL2-Linux-Kernel/tools/build/Makefile.build:145: tests/perf-in.o] Error 1
make[3]: *** [/mnt/c/Users/micro/Documents/tools/WSL2-Linux-Kernel/tools/build/Makefile.build:139: tests] Error 2
make[2]: *** [Makefile.perf:507: perf-in.o] Error 2
make[1]: *** [Makefile.perf:206: sub-make] Error 2
make: *** [Makefile:70: all] Error 2
谁能帮我弄清楚我做错了什么?
解决方案
简短的回答 - 尝试克隆 repo 并在您的 WSL 主目录(在 ext4 文件系统下)而不是 C: 驱动器下构建。
(更多)更长的答案-您可能遇到两个单独的问题,源位于 C: 驱动器上(并通过 访问它/mnt/c
):
首先,权限问题。甚至使用自动挂载选项在 WSL2 中git clone
对我来说也失败了。我猜你是用 Windows git 而不是 Linux git 来检查的?/mnt/c
/mnt/c
您可以使用类似sudo mount -t drvfs C: /mnt/src -o uid=1000,gid=1000
(请参阅此答案)重新安装驱动器以更正权限。我能够做到这一点,但后来我注意到以下...
即使在修复权限之后,我仍然面临下一个问题 - NTFS 驱动器上的 WSL 区分大小写支持。Linuxgit clone
警告我有关重复的目录。我相信这就是为什么您会收到“多重定义”警告的原因-该源树包含一些重复的目录名称,这些名称仅在大小写上有所不同。Windows git 正在正确处理该问题,但我的猜测是构建失败,因为它没有解析正确的目录。我还没有尝试过,但是在目录上设置区分大小写的命令在那个 MS doc 中。
但即便如此,如果您解决了这些问题(并且您可能可以),我仍然建议避免使用/mnt/c
WSL2(以及任何其他 NTFS 驱动器)。由于 NTFS 在 WSL2 下的性能不佳(比在 WSL1 下差很多,差很多),任何繁重的文件操作都将完全停止。例如,git clone
那个 repo 只花了几秒钟,/home/myusername/src
但大约 10 分钟(!!!)/mnt/c
。这是 WSL2 的一个已知问题。
当我想对 NTFS 驱动器运行 Linux 命令时,我仍然保留 WSL1。例如,s3cmd
将我的照片同步/备份到 S3 兼容存储。我将 WSL2 用于其他一切,但我坚持使用 ext4 文件系统,那里的性能比 WSL1更好。
推荐阅读
- javascript - 错误:需要数据和盐参数(节点未接收来自角度的用户输入对象?)
- python - ModuleNotFoundError:没有名为“cherrypy”的模块
- ember.js - 无法使用“get”Ember 3.2 加载关系
- vue.js - vuetify v1.1 我可以为 v-card 颜色设置一些透明度吗?
- material-design - 在 Flutter 中平滑过渡状态
- java - Java和正确使用类层次结构
- swift - 如何以编程方式添加 imageView 宽度/高度?
- firebase - Firebase 托管页面未找到空缓存和硬重新加载错误
- javascript - 如何添加带圆圈的图像Reactjs
- reactjs - 如何用 jest 和酵素模拟 React 组件事件