安装bpftrace和bcc的踩坑记录

news2024/11/23 8:09:25

最后在Ubuntu22.04使用Ubuntu提供的安装命令完成了安装。这里是记录尝试在Ubuntu18.04和Ubuntu22.04使用源码安装未果的过程。

文章目录

    • 22版本安装bcc
      • 准备工具
      • 安装命令
      • 使用报错:
      • iovisor封装的安装方式
      • ubuntu的安装方式
    • For Bionic (18.04 LTS)官方提供的源码安装
      • 准备工具安装
      • 下载和安装
      • 使用报错:
    • 安装bpftrace
      • Ubuntu22自带安装
      • Ubuntu22源码安装
      • Ubuntu18源码安装
    • 参考:
  • by the way


22版本安装bcc

准备工具

sudo apt install -y zip bison build-essential cmake flex git libedit-dev \
  libllvm14 llvm-14-dev libclang-14-dev python3 zlib1g-dev libelf-dev libfl-dev python3-setuptools \
  liblzma-dev libdebuginfod-dev arping netperf iperf

安装命令

wget https://github.com/iovisor/bcc/releases/download/v0.28.0/bcc-src-with-submodule.tar.gz
mkdir bcc/build; cd bcc/build
cmake ..
make
sudo make install
cmake -DPYTHON_CMD=python3 .. # build python3 binding
pushd src/python/
make
sudo make install
popd

注意,上面那段安装命令不是直接使用官网提供的git clone命令,因为那不是release版本缺少头文件,会产生如下报错:

CMake Warning at CMakeLists.txt:73 (message):
  Failed to update submodule libbpf

bcc/src/cc/frontends/clang/b_frontend_action.cc:37:
/home/xmu3/bcc/src/cc/bcc_libbpf_inc.h:8:11: fatal error: libbpf/src/bpf.h: No such file or directory
    8 | # include "libbpf/src/bpf.h"
      |           ^~~~~~~~~~~~~~~~~~
compilation terminated.
make[2]: *** [src/cc/frontends/clang/CMakeFiles/clang_frontend-objects.dir/build.make:90: src/cc/frontends/clang/CMakeFiles/clang_frontend-objects.dir/b_frontend_action.cc.o] Error 1

使用报错:

sudo ./execsnoop.py
Traceback (most recent call last):
  File "/home/bcc/tools/./execsnoop.py", line 23, in <module>
    from bcc import BPF
  File "/usr/lib/python3/dist-packages/bcc-EAD_HASH_NOTFOUND_GITDIR_N-py3.10.egg/bcc/__init__.py", line 26, in <module>
  File "/usr/lib/python3/dist-packages/bcc-EAD_HASH_NOTFOUND_GITDIR_N-py3.10.egg/bcc/libbcc.py", line 17, in <module>
  File "/usr/lib/python3.10/ctypes/__init__.py", line 374, in __init__
    self._handle = _dlopen(self._name, mode)
OSError: libbcc.so.0: cannot open shared object file: No such file or directory

可以查到很多关于libbcc.so的报错,但是后面的错误各有差异,一直解决未果。(谁找到了希望滴滴我

iovisor封装的安装方式

没有尝试过,但是听所也有坑。

sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 4052245BD4284CDD
echo "deb https://repo.iovisor.org/apt/$(lsb_release -cs) $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/iovisor.list
sudo apt-get update
sudo apt-get install bcc-tools libbcc-examples linux-headers-$(uname -r)

ubuntu的安装方式

这种方式安装的目录是在/usr/sbin,那些文件都是*-bpfcc的样式。和源码安装相比有的功能这里是没有的。以及Ubuntu18.04之后的版本才能使用这个命令,之前以及18.04都没有

sudo apt-get install bpfcc-tools linux-headers-$(uname -r)

For Bionic (18.04 LTS)官方提供的源码安装

准备工具安装

sudo apt-get -y install zip bison build-essential cmake flex git libedit-dev \
  libllvm6.0 llvm-6.0-dev libclang-6.0-dev python zlib1g-dev libelf-dev libfl-dev python3-setuptools \
  liblzma-dev arping netperf iperf

下载和安装

git clone https://github.com/iovisor/bcc.git
mkdir bcc/build; cd bcc/build
cmake ..
make
sudo make install
cmake -DPYTHON_CMD=python3 .. # build python3 binding
pushd src/python/
make
sudo make install
popd

使用报错:

yi@PC:~/bcc/build$ sudo /usr/share/bcc/tools/opensnoop
Traceback (most recent call last):
  File "/usr/share/bcc/tools/opensnoop", line 24, in <module>
    from bcc import ArgString, BPF
  File "/usr/lib/python2.7/dist-packages/bcc/__init__.py", line 27, in <module>
    from .libbcc import lib, _CB_TYPE, bcc_symbol, bcc_symbol_option, _SYM_CB_TYPE
  File "/usr/lib/python2.7/dist-packages/bcc/libbcc.py", line 20, in <module>
    lib.bpf_module_create_b.restype = ct.c_void_p
  File "/usr/lib/python2.7/ctypes/__init__.py", line 379, in __getattr__
    func = self.__getitem__(name)
  File "/usr/lib/python2.7/ctypes/__init__.py", line 384, in __getitem__
    func = self._FuncPtr((name_or_ordinal, self))
AttributeError: /usr/lib/x86_64-linux-gnu/libbcc.so.0: undefined symbol: bpf_module_create_b

修改脚本开头,把python换成python3,或者使用命令时加上python3
好的,接下来这个bug成为每一次源码安装都跨不过的坎了

sudo /usr/share/bcc/tools/execsnoop
LLVM ERROR: 

最开始以为LLVM9以下bcc好像不支持了。其实和LLVM没关系,官方也是用的LLVM-7。安装完LLVM15之后,源码安装过程中另一个问题,关于python

[ 36%] Building sdist for python3
Traceback (most recent call last):
  File "/home/yi/下载/bcc/build/src/python/bcc-python3/setup.py", line 3, in <module>
    from setuptools import setup
  File "/usr/local/lib/python3.9/site-packages/setuptools/__init__.py", line 23, in <module>
    from setuptools.dist import Distribution
  File "/usr/local/lib/python3.9/site-packages/setuptools/dist.py", line 34, in <module>
    from setuptools import windows_support
  File "/usr/local/lib/python3.9/site-packages/setuptools/windows_support.py", line 2, in <module>
    import ctypes
  File "/usr/local/lib/python3.9/ctypes/__init__.py", line 8, in <module>
    from _ctypes import Union, Structure, Array
ModuleNotFoundError: No module named '_ctypes'
src/python/CMakeFiles/bcc_py_python3.dir/build.make:71: recipe for target 'src/python/bcc-python3/dist/bcc-0.28.0+9596edb9.tar.gz' failed
make[2]: *** [src/python/bcc-python3/dist/bcc-0.28.0+9596edb9.tar.gz] Error 1
CMakeFiles/Makefile2:616: recipe for target 'src/python/CMakeFiles/bcc_py_python3.dir/all' failed
make[1]: *** [src/python/CMakeFiles/bcc_py_python3.dir/all] Error 2
Makefile:140: recipe for target 'all' failed
make: *** [all] Error 2

查了查大家都说是要重装python3,结果系统给我重装没了
python2运行以下报错,让用python3即可

sudo ./execsnoop
Traceback (most recent call last):
  File "./execsnoop", line 23, in <module>
    from bcc import BPF
ImportError: No module named bcc

python3运行又是LLVM ERROR
单步调试在b = BPF(text=bpf_text)处

sudo python3 ./hello_world.py
bpf: Argument list too long. Program  too large (0 insns), at most 4096 insns

Traceback (most recent call last):
  File "./hello_world.py", line 12, in <module>
    BPF(text='int kprobe__sys_clone(void *ctx) { bpf_trace_printk("Hello, World!\\n"); return 0; }').trace_print()
  File "/usr/lib/python3/dist-packages/bcc-0.28.0+9596edb9-py3.6.egg/bcc/__init__.py", line 487, in __init__
  File "/usr/lib/python3/dist-packages/bcc-0.28.0+9596edb9-py3.6.egg/bcc/__init__.py", line 1465, in _trace_autoload
  File "/usr/lib/python3/dist-packages/bcc-0.28.0+9596edb9-py3.6.egg/bcc/__init__.py", line 527, in load_func
Exception: Failed to load BPF program b'kprobe__sys_clone': Argument list too long

再debug下去感觉没完没了,干了一天后就换Ubuntu22了,两个系统的使用感像从农村到了城里。

安装bpftrace

Ubuntu22自带安装

官方安装说明
安装的目录是在/usr/sbin,那些文件都是*-bt的样式

sudo apt-get install -y bpftrace

但是也会报错:

ERROR: Could not resolve symbol: /proc/self/exe:BEGIN_trigger

这个报错在github上有很长的讨论,不过解决方案就一句命令:

sudo apt-get install bpftrace-dbgsym

在这里插入图片描述

然而,安装说无法定位,也是报错。这时候去Launchpad上面有发布的软件包安装bpftrace-dbgsym_0.14.0-1_amd64.ddeb这个调试符号包。下载后

sudo dpkg -i bpftrace-dbgsym_0.14.0-1_amd64.ddeb

在Ubuntu下查找某个软件包的PPA源的方法主要有以下几种:
1、在软件包的官网或者GitHub仓库的说明中查找,维护者通常会提供建议的PPA源。
2、在Launchpad网站上搜索软件包名称,查看是否存在相关的PPA源。Launchpad托管了Ubuntu的大量PPA源。
3、使用Google搜索"软件包名 + ppa",看是否有相关讨论帖子推荐的PPA源。
4、使用命令行工具apt-cache search,看搜索结果中是否有类似“ppa.launchpad.net”的源,这表示系统已知的PPA。
5、使用命令行工具apt-add-repository,它可以直接通过ppa:user/ppa-name的格式添加某PPA源。
6、检查/etc/apt/sources.list.d目录下的配置文件,是否已有该软件包相关的PPA源,文件名称通常是ppa的名称。
7、使用诸如aptly、repoman等第三方工具也可以搜索本地已知的所有PPA源列表。
一般来说,维护者提供的PPA源是首选,查找时注意区分体系架构、Ubuntu版本、软件包版本等差异。

Ubuntu22源码安装

从源码安装的话:bpftrace 二进制文件将安装在 /usr/local/bin/bpftrace 中,工具将安装在 /usr/local/share/bpftrace/tools 中。可以使用 cmake 的参数更改安装位置,默认位置为 -DCMAKE_INSTALL_PREFIX=/usr/local

sudo apt-get update
sudo apt-get install -y libbpfcc-dev
sudo apt-get install -y \
  bison \
  cmake \
  flex \
  g++ \
  git \
  libelf-dev \
  zlib1g-dev \
  libfl-dev \
  systemtap-sdt-dev \
  binutils-dev \
  libcereal-dev \
  llvm-dev \
  llvm-runtime \
  libclang-dev \
  clang \
  libpcap-dev \
  libgtest-dev \
  libgmock-dev \
  asciidoctor \
  libdw-dev \
  pahole
git clone https://github.com/iovisor/bpftrace --recurse-submodules
mkdir bpftrace/build; cd bpftrace/build;
../build-libs.sh
cmake -DCMAKE_BUILD_TYPE=Release ..
make -j8
sudo make install

也是有报错,但是忘记记录了。

Ubuntu18源码安装

在这里插入图片描述

bpftrace将llvm降到7,并且源码安装0.11.1之后,make报错:

bpftrace/src/attached_probe.cpp:801:51: error: too few arguments to function ‘void* bpf_attach_uprobe(int, bpf_probe_attach_type, const char*, const char*, uint64_t, pid_t, int, int, perf_reader_cb, void*)’
                                         probe_.pid);
                                                   ^
In file included from /home/xmu2/bpftrace/src/attached_probe.h:10:0,
                 from /home/xmu2/bpftrace/src/attached_probe.cpp:16:
/usr/include/bcc/libbpf.h:80:8: note: declared here
 void * bpf_attach_uprobe(int progfd, enum bpf_probe_attach_type attach_type,
        ^~~~~~~~~~~~~~~~~
/home/xmu2/bpftrace/src/attached_probe.cpp: In member function ‘void bpftrace::AttachedProbe::attach_usdt(int)’:
/home/xmu2/bpftrace/src/attached_probe.cpp:911:77: error: too few arguments to function ‘void* bpf_attach_uprobe(int, bpf_probe_attach_type, const char*, const char*, uint64_t, pid_t, int, int, perf_reader_cb, void*)’
       eventname().c_str(), probe_.path.c_str(), offset_, pid == 0 ? -1 : pid);
                                                                             ^
In file included from /home/xmu2/bpftrace/src/attached_probe.h:10:0,
                 from /home/xmu2/bpftrace/src/attached_probe.cpp:16:
/usr/include/bcc/libbpf.h:80:8: note: declared here
 void * bpf_attach_uprobe(int progfd, enum bpf_probe_attach_type attach_type,
        ^~~~~~~~~~~~~~~~~
/home/xmu2/bpftrace/src/attached_probe.cpp: In member function ‘void bpftrace::AttachedProbe::attach_tracepoint()’:
/home/xmu2/bpftrace/src/attached_probe.cpp:927:26: error: too few arguments to function ‘void* bpf_attach_tracepoint(int, const char*, const char*, int, int, int, perf_reader_cb, void*)’
       eventname().c_str());
                          ^
In file included from /home/xmu2/bpftrace/src/attached_probe.h:10:0,
                 from /home/xmu2/bpftrace/src/attached_probe.cpp:16:
/usr/include/bcc/libbpf.h:87:8: note: declared here
 void * bpf_attach_tracepoint(int progfd, const char *tp_category,
        ^~~~~~~~~~~~~~~~~~~~~
/home/xmu2/bpftrace/src/attached_probe.cpp: In member function ‘void bpftrace::AttachedProbe::attach_watchpoint(int, const string&)’:
/home/xmu2/bpftrace/src/attached_probe.cpp:1120:23: error: ‘bpf_attach_perf_event_raw’ was not declared in this scope
   int perf_event_fd = bpf_attach_perf_event_raw(progfd_, &attr, pid, -1, -1, 0);
                       ^~~~~~~~~~~~~~~~~~~~~~~~~
/home/xmu2/bpftrace/src/attached_probe.cpp:1120:23: note: suggested alternative: ‘bpf_attach_perf_event’
   int perf_event_fd = bpf_attach_perf_event_raw(progfd_, &attr, pid, -1, -1, 0);
                       ^~~~~~~~~~~~~~~~~~~~~~~~~
                       bpf_attach_perf_event
src/CMakeFiles/bpftrace.dir/build.make:75: recipe for target 'src/CMakeFiles/bpftrace.dir/attached_probe.cpp.o' failed
make[2]: *** [src/CMakeFiles/bpftrace.dir/attached_probe.cpp.o] Error 1
CMakeFiles/Makefile2:1160: recipe for target 'src/CMakeFiles/bpftrace.dir/all' failed
make[1]: *** [src/CMakeFiles/bpftrace.dir/all] Error 2
Makefile:145: recipe for target 'all' failed
make: *** [all] Error 2

bpftrace安装时报错

CMake Error at /usr/local/share/cmake-3.23/Modules/FindPackageHandleStandardArgs.cmake:230 (message):
  Please run /home/xmu2/bpftrace/build-libs.sh from the build folder first
  (missing: LIBBCC_LIBRARIES LIBBCC_INCLUDE_DIRS)
Call Stack (most recent call first):
  /usr/local/share/cmake-3.23/Modules/FindPackageHandleStandardArgs.cmake:594 (_FPHSA_FAILURE_MESSAGE)
  cmake/FindLibBcc.cmake:84 (FIND_PACKAGE_HANDLE_STANDARD_ARGS)
  CMakeLists.txt:116 (find_package)

按照其他说法安装libbpfcc后仍然报错:

CMake Error at /usr/local/share/cmake-3.23/Modules/FindPackageHandleStandardArgs.cmake:230 (message):
  Please run /home/xmu2/bpftrace/build-libs.sh from the build folder first
  (missing: LIBBCC_INCLUDE_DIRS)
Call Stack (most recent call first):
  /usr/local/share/cmake-3.23/Modules/FindPackageHandleStandardArgs.cmake:594 (_FPHSA_FAILURE_MESSAGE)
  cmake/FindLibBcc.cmake:84 (FIND_PACKAGE_HANDLE_STANDARD_ARGS)
  CMakeLists.txt:116 (find_package)

变成版本llvm-7之后:

/virtual/main.c:138:1: error: expected identifier or '('
段错误

参考:

https://blog.csdn.net/Longyu_wlz/article/details/109900096
https://github.com/bpftools/linux-observability-with-bpf.git

https://blog.csdn.net/qq_34258344/article/details/104400738
https://yaoyao.io/posts/how-to-setup-ebpf-env-on-ubuntu.html

作者回复: libbpf-dev只包含在比较新的发行版中,其他发行版可以从源码安装,具体步骤可以参考 https://github.com/libbpf/libbpf#build。

另外,我们案例的Github中也有源码编译的详细步骤:https://github.com/feiskyer/ebpf-apps/blob/main/bpf-apps/Makefile#L21-L22


by the way

按道理这些bug都可以去github开个issue的,不过比较赶时间,也不确定可不可以复现,有谁又遇到了可以去开一个。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/964548.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringCloudGateway集成SpringDoc

SpringCloudGateway集成SpringDoc 最近在搞Spring版本升级&#xff0c;按客户要求升级Spring版本&#xff0c;原来用着SpringBoot 2.2.X版本&#xff0c;只需要升级SpringBoot 2.X最新版本也就可以满足客户Spring版本安全要求&#xff0c;可是好像最新的SpringBoot 2.X貌似也不…

Laravel chunk和chunkById的坑

在编写定时任务脚本的时候&#xff0c;经常会用到chunk和chunkById的API。 一、前言 数据库引擎为innodb。 表结构简述&#xff0c;只列出了本文用到的字段。 字段类型注释idint(11)IDtypeint(11)类型mark_timeint(10)标注时间&#xff08;时间戳&#xff09; 索引&#x…

手撕 视觉slam14讲 ch13 代码(1)工程框架与代码结构

在学习slam一年之后开始&#xff0c;开始自己理思路&#xff0c;全手敲完成ch13的整个代码 我们按照自己写系统的思路进行&#xff0c;首先确定好SLAM整体系统的流程&#xff0c;见下图&#xff0c;输入为双目图像&#xff0c;之后进入前端位姿估计和后端优化&#xff0c;中间…

滑动窗口实例3(最大连续1的个数Ⅲ)

题目&#xff1a; 给定一个二进制数组 nums 和一个整数 k&#xff0c;如果可以翻转最多 k 个 0 &#xff0c;则返回 数组中连续 1 的最大个数 。 示例 1&#xff1a; 输入&#xff1a;nums [1,1,1,0,0,0,1,1,1,1,0], K 2 输出&#xff1a;6 解释&#xff1a;[1,1,1,0,0,1,1…

stable diffusion实践操作-宽高设置以及高清修复

系列文章目录 stable diffusion实践操作 文章目录 系列文章目录前言一、SD宽高怎么设置&#xff1f;1.1 宽高历史 二、高清修复总结 前言 主要介绍SD的宽高设置以及高清修复 一、SD宽高怎么设置&#xff1f; 1.1 宽高历史 SD生成256256图片效果最好。512512是SD一直使用的画…

【管理运筹学】第 7 章 | 图与网络分析(1,图论背景以及基本概念、术语)

文章目录 引言一、图与网络的基本知识1.1 图与网络的基本概念1.1.1 图的定义1.1.2 图中相关术语1.1.3 一些特殊图类1.1.4 图的运算 写在最后 引言 按照正常进度应该学习动态规划了&#xff0c;但我想换换口味&#xff0c;而且动态规划听说也有一定难度&#xff0c;还不一定会考…

设计模式—简单工厂

目录 一、前言 二、简单工厂模式 1、计算器例子 2、优化后版本 3、结合面向对象进行优化&#xff08;封装&#xff09; 3.1、Operation运算类 3.2、客户端 4、利用面向对象三大特性&#xff08;继承和多态&#xff09; 4.1、Operation类 4.2、加法类 4.3、减法类 4…

VTK——使用ICP算法进行模型配准

ICP算法 迭代最近点&#xff08;Iterative Closest Point&#xff0c;ICP&#xff09;算法是一种用于两个三维形状之间几何对齐&#xff08;也叫做配准&#xff09;的计算方法。通常&#xff0c;这两个形状至少有一个是点云数据。ICP算法用于最小化源点云与目标点云之间点到点…

【设计模式】Head First 设计模式——构建器模式 C++实现

设计模式最大的作用就是在变化和稳定中间寻找隔离点&#xff0c;然后分离它们&#xff0c;从而管理变化。将变化像小兔子一样关到笼子里&#xff0c;让它在笼子里随便跳&#xff0c;而不至于跳出来把你整个房间给污染掉。 设计思想 ​ 将一个复杂对象的构建与其表示相分离&…

【两个有序数组合并】

问题描述: 给定两个有序整数数组 A 和 B&#xff0c;将B合并到A中&#xff0c;使得 A 成为一个有序数组。 说明: 初始化 A 和 B 的元素数量分别为 m 和 n。A有足够的空间&#xff08;空间大小大于或等于 m n&#xff09;来保存 B 中的元素。默认升序。 输入输出描述&#xf…

大数据组件-Flume集群环境的启动与验证

&#x1f947;&#x1f947;【大数据学习记录篇】-持续更新中~&#x1f947;&#x1f947; 个人主页&#xff1a;beixi 本文章收录于专栏&#xff08;点击传送&#xff09;&#xff1a;【大数据学习】 &#x1f493;&#x1f493;持续更新中&#xff0c;感谢各位前辈朋友们支持…

《YOLOv5:从入门到实战》专栏介绍 专栏目录

&#x1f31f;YOLOv5&#xff1a;从入门到实战 | 目录 | 使用教程&#x1f31f; 本专栏涵盖了丰富的YOLOv5算法从入门到实战系列教程&#xff0c;专为学习YOLOv5的同学而设计&#xff0c;堪称全网最详细的教程&#xff01;该专栏从YOLOv5基础知识入门到项目应用实战都提供了详细…

JavaWeb_LeadNews_Day10-Xxljob, Redis实现定时热文章

JavaWeb_LeadNews_Day10-Xxljob, Redis实现定时热文章 xxl-job概述windows部署调度中心docker部署调度中心 xxl-job入门案例xxl-job分片广播热点文章定时计算思路分析具体实现热文章计算定时计算 查询文章接口改造来源Gitee xxl-job概述 windows部署调度中心 运行 xxl-job\do…

【数据结构】队列---C语言版(详解!!!)

文章目录 &#x1f438;一、队列的概念及结构&#x1f344;1、队列的概念定义&#x1f344;2、动图演示 &#x1f438;二、队列的实现&#x1f438;三、链表结构队列详解&#x1f34e;创建队列的结构⭕接口1&#xff1a;定义结构体&#xff08;QNode、Queue&#xff09;⭕接口2…

LeetCode 23 合并 K 个升序链表

LeetCode 23 合并 K 个升序链表 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;https://leetcode.cn/problems/merge-k-sorted-lists/description/ 博主Github&#xff1a;https://github.com/GDUT-Rp/LeetCode 题目&#xff1a; 给你一个链表数组…

中心差分法-学习笔记《结构动力学-陈政清》

激励分段解析法仅仅对外载荷进行了离散&#xff0c;但对运动方程还是严格满足的&#xff0c;体系的运动在时间轴上依然是满足运动微分方程。然而&#xff0c;一般的时域逐步积分法进一步放松要求&#xff0c;不仅仅对外荷载进行离散化处理&#xff0c;也对体系的运动进行离散化…

前端Vue仿企查查天眼查高管信息列表组件

随着技术的不断发展&#xff0c;传统的开发方式使得系统的复杂度越来越高。在传统开发过程中&#xff0c;一个小小的改动或者一个小功能的增加可能会导致整体逻辑的修改&#xff0c;造成牵一发而动全身的情况。为了解决这个问题&#xff0c;我们采用了组件化的开发模式。通过组…

PCL 判断四点共面(三维空间)

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 这里仍然沿用之前的方式来判断三维空间中四个顶点的共面性,三维空间中四个顶点可以构成三条线段(共用同一个顶点),这三条线段所代表的矢量可以组成一个立方空间,如下图所示: 这个立方体的体积其实就是由这三个…

Blender里复制对象动画

假设在Blender里有2个对象&#xff0c;其中一个添加了动画&#xff0c;另外一个没有添加动画&#xff0c;那么如何把已有的动画拷贝到没有动画的对象上呢&#xff1f; 分为2步&#xff1a; 先选中没有动画的对象&#xff0c;再按shift键选中有动画的对象&#xff0c;此时2个对…

【论文精读】Learning Transferable Visual Models From Natural Language Supervision

Learning Transferable Visual Models From Natural Language Supervision 前言Abstract1. Introduction and Motivating Work2. Approach2.1. Creating a Sufficiently Large Dataset2.2. Selecting an Efficient Pre-Training Method2.3. Choosing and Scaling a Model2.4. P…