ffmpeg学习:ubuntu下编译Android版ffmpeg-kit
文章目录
- 前言
- 一. 配置环境
- 1.1 虚拟机版本
- 1.2 安装Android环境
- 1.2.1 Android SDK安装
- 1.2.2 Android NDK安装
- 1.3 编译前的准备工作
- 1.3.1 libtasn1-1安装
- 1.3.2 meson安装
- 1.3.3 harfbuzz下载
- 二. 编译ffmpeg-kit
- 三. 总结
前言
ffmpeg-kit是一款跨多个平台的,用于在应用程序中运行FFprobe相关命令的库。只可惜的是这款优秀的开源框架的作者最近表示后续不再维护Saying Goodbye to FFmpegKit。
由于公司需要在ffmeg上增加gl-transitions,同时公司用到了ffmpeg-kit。因此,不得不手动编译一个FFmpegKit。
一. 配置环境
1.1 虚拟机版本
我选择的是VirtualBox来安装虚拟机,虚拟机建议用7.0.14版本。镜像文件是ubuntu-20.04.4-desktop-amd64.iso,下载地址我用的是网易开源镜像:ubuntu-releases-20.04。(建议使用20.04以上的iso镜像文件)
1.2 安装Android环境
在经过漫长的虚拟机安装等待后,安装好最基本的vim,可以参考之前的文章ffmpeg学习:ubuntu下编译ffmpeg(全网最懒的编译脚本) 。
通过以下命令更新软件库:
apt-get update // 更新源文件,并不会做任何安装升级操作
apt-get upgrade // 升级所有已安装的包
完成上面的操作,那么接下来就是安装Android SDK和Android NDK了。
1.2.1 Android SDK安装
在安装AndroidSDK之前先检查是否安装好JDK,ubuntu20.04.4没有预置JDK。
当你在命令行中输入jdk的时候会有如下提示:
找不到命令“jdk”,您的意思是:command 'juk' from snap juk (24.12.1)command 'jd' from deb jdim (0.3.0-1build1)command 'juk' from deb juk (4:19.12.3-1)command 'jdb' from deb openjdk-11-jdk-headless (11.0.24+8-1ubuntu3~20.04)command 'jdb' from deb openjdk-13-jdk-headless (13.0.7+5-0ubuntu1~20.04)command 'jdb' from deb openjdk-16-jdk-headless (16.0.1+9-1~20.04)command 'jdb' from deb openjdk-17-jdk-headless (17.0.12+7-1ubuntu2~20.04)command 'jdb' from deb openjdk-21-jdk-headless (21.0.4+7-1ubuntu2~20.04)command 'jdb' from deb openjdk-8-jdk-headless (8u422-b05-1~20.04)
我这里根据当前虚拟机系统选择的是openjdk-17-jdk-headless,其中headless代表缺少显示设备,键盘或鼠标的系统配置。AndroidSDK和JDK版本间的关系如下:

(该图来自官网Android build 中的 Java 版本)
完成JDK的安装,接下来就可以安装AndroidSDK了,之所以用到AndroidSDK是因为后续要打包成arr,此时必须使用到AndroidSDK。
Android SDK的安装,我用的是命令行工具,下载地址:命令行工具。直接拉到最底部,可以看到仅限命令行工具。

选择linux的最新版本。下载到本地,注意需要通过以下步骤处理:(参考Android官网sdkmanager文档 )
- 从 Android Studio 页面下载最新的命令行工具软件包,然后解压缩该软件包。
- 将解压缩的 cmdline-tools 目录移至您选择的新目录,例如 android_sdk。这个新目录就是您的 Android SDK 目录。
- 在解压缩的 cmdline-tools 目录中,创建一个名为 latest 的子目录。
- 将原始 cmdline-tools 目录内容(包括 lib 目录、bin 目录、NOTICE.txt 文件和 source.properties 文件)移动到新创建的 latest 目录中,现在,您就可以从这个位置使用命令行工具了。
在这一切都做好后,我通过’cp’命令将其拷贝到/opt目录下。我的建议是最好先在home目录下完成,包括NDK。
先通过sdkmanager命令查看
sdkmanager --list
使用sdkmanager命令下载platform-tools,platforms,build-tools
sdkmanager "platform-tools" "platforms;android-33" "build-tools;33.0.1"
以上的命令如果出现权限问题,请先在AndroidSDK目录上增加权限:
sudo chmod -R 777 XXXX/
对于权限问题(类似 Warning: Failed to read or create install properties file.),个人以为最好的解决方法是AndroidSDK和NDK就放在home目录下。
接下来配置AndroidSDK环境,使用命令:
vim ~/.bashrc
用vim命令打开.bashrc,然后输入下面两条语句
# 配置AndroidSDK环境
export ANDROID_SDK_ROOT=/opt/program-tools/AndroidSDK
export PATH=$PATH:$ANDROID_SDK_ROOT/cmdline-tools/latest/bin
上面的ANDROID_SDK_ROOT改成你自己的SDK路径。
然后执行
source ~/.bashrc
1.2.2 Android NDK安装
和上面的SDK安装一样先下载,再配置环境,但是这里需要选对版本,参考ffmpeg-kit的issues
#292,下载版本为25.2.9519653SHA1值是53af80a1cce9144025b81c78c8cd556bff42bd0e,下载完成后直接解压拷贝到相对应的目录下。
配置环境的步骤和上面一样:
# 配置AndroidNDK环境
export ANDROID_NDK_ROOT=/opt/program-tools/AndroidSDK/ndk/25.2.9519653
export PATH=$PATH:$ANDROID_NDK_ROOT
运行
source ~/.bashrc
通过命令
ndk-build -v
出现类似于以下的提示,就成功了
GNU Make 4.3
为 x86_64-pc-linux-gnu 编译
Copyright (C) 1988-2020 Free Software Foundation, Inc.
许可证:GPLv3+:GNU 通用公共许可证第 3 版或更新版本<http://gnu.org/licenses/gpl.html>。
本软件是自由软件:您可以自由修改和重新发布它。
在法律允许的范围内没有其他保证。
至此,完成了万里长征的第一步。
1.3 编译前的准备工作
参考该文章Building中的Android-Prerequisites
通过apt-get命令下载以下依赖
构建脚本需要以下包
autoconf automake libtool pkg-config curl git doxygen nasm
仅当您要构建相应的外部库时才需要安装这些可选包
cmake gcc gperf texinfo yasm bison autogen wget autopoint meson ninja ragel groff gtk-doc-tools libtasn1-1
备注
libsndfile 需要autogen
bison > 2.4,wget,gnutls 需要自动点
libwebp 和 x265 需要cmake > 3.9
freetype 和 fribidi 需要gcc
fontconfig 需要gperf
libiconv 需要groff
gnutls 需要gtk-doc-tools
gnutls 所需的libtasn1-1
meson > 0.56,dav1d 的忍者
harfbuzz 要求ragel
某些平台上 gmp 需要texinfo
某些平台上 libvpx 和 x265 需要yasm
这些依赖包太多了,一个个的敲键盘太累,那么我们可以用shell脚本解决
#! /bin/bashset -esudo apt-get update && \
sudo apt-get -y --allow-change-held-packages full-upgrade && \
sudo apt-get -y install \autoconf\automake\libtool\pkg-config\curl\git\doxygen\nasmsudo apt-get update && \sudo apt-get -y --allow-change-held-packages full-upgrade && \sudo apt-get -y install \cmake\gcc\gperf\texinfo\yasm\bison\autogen\wget\autopoint\meson\ninja-build\ragel\groff\gtk-doc-tools
通过该shell脚本可以下载大部分依赖包,其中有两个依赖包需要注意libtasn1-1和meson
1.3.1 libtasn1-1安装
libtasn1-1的作用:
libtasn1-1 是一个用于处理 ASN.1 编码和解码的库。ASN.1(抽象语法标记语言)是一种描述数据结构的标准,广泛用于通信协议(如 SSL/TLS 和 X.509 证书)中。libtasn1 库提供了对 ASN.1 数据的解析和编码的支持。
我的ubuntu-20.04.4无法安装libtasn1-1,这就意味着在编译开启 –enable-gnutls的ffmpeg时候会出现问题。可以通过如下步骤来解决(参考文档)
命令如下:
# 下载解压
wget http://ftp.gnu.org/gnu/libtasn1/libtasn1-4.20.0.tar.gz && tar -xzvf libtasn1-4.20.0.tar.gz && cd libtasn1-4.20.0
# 编译
./configure --prefix=/usr --disable-static
make clean
make
# 安装
sudo make install
配置libtasn1输入以下命令
# 管理员身份
sudo -s
echo /usr/lib >> /etc/ld.so.conf && ldconfig
以下是chatgpt输出的:
命令 echo /usr/lib >> /etc/ld.so.conf && ldconfig 的作用是将 /usr/lib 路径添加到动态链接器的配置文件中,并刷新链接器的缓存。让我们逐个分解它的含义:
命令的功能:
- echo 命令会将字符串 /usr/lib 输出到标准输出。
- >> 是重定向操作符,它会将输出追加到指定的文件中。在这里,/etc/ld.so.conf 是动态链接器的配置文件,记录了动态库的路径。
- 这条命令会将 /usr/lib 路径追加到 /etc/ld.so.conf 文件的末尾。如果这个目录没有被列出,动态链接器在查找共享库时可能会找不到它。
- ldconfig 是一个用于更新系统中的共享库缓存的命令。它会扫描 ld.so.conf 中列出的所有目录,并建立一个缓存,以加快后续的库查找。
- 当你修改了共享库路径(例如,添加了新的库目录),需要运行 ldconfig 来更新系统缓存。
再在bashrc中输入:
LIBTASN1_CFLAGS="-I/usr/include"
LIBTASN1_LIBS="-L/usr/lib -ltasn1"
执行命令:
source ~/.bashrc
1.3.2 meson安装
我的ubuntu-20.04.4下载的meson最新版是0.53,需要重新安装0.58.1以上的meson,我的因为这个在编译的时候会报错(高版本的估计没有):
meson.build:25:0: ERROR: Could not invoke sanity test executable: [Errno 8] Exec format error: 'XXXXXX/.tmp/cmake/build/android-arm64/dav1d/meson-private/sanitycheckc.exe'.
参考文章:
issues52
解决方案是通过pip3去安装meson
参考:
ubuntu 20.04 安装与升级 meson 的版本
首先通过apt-get安装pip3
sudo apt install python3-pip
安装好pip3后,再通过以下命令安装
pip3 install meson==0.58.1
使用meson -v命令显示版本0.58.1,代表安装成功。
1.3.3 harfbuzz下载
我在编译的过程中,发现一个问题,那就是harfbuzz无法clone下来。同样的,如果遇到此类问题,建议通过ffmpeg-kit的代码来查看,找到ffmpeg-kit/scripts/source.sh的代码。
其中部分代码:
harfbuzz)SOURCE_REPO_URL="https://github.com/arthenica/harfbuzz"SOURCE_ID="8.0.1"SOURCE_TYPE="TAG";;
可以看出需要下载的是https://github.com/arthenica/harfbuzz的tag8.0.1的源码,但是不知道为啥无法下载,所以我这里就手动下载了harfbuzz-8.0.1
二. 编译ffmpeg-kit
经过上面的准备工作,可以正式进入编译环节了。
首先克隆ffmpeg-kit
git clone git@github.com:arthenica/ffmpeg-kit.git
进入到目录下,执行 ./android.sh可以得到最基础的不会打开任何依赖项的ffmpeg。
如果需要打开需要的依赖项,可以参考这篇文章安卓脚本
。
拿full-gpl所依赖的扩展程序来说,通过chat-gpt给出的功能作用如下:
dav1d: 这是 AV1 视频编解码器的解码器,FFmpeg 使用它来解码 AV1 格式的视频流。fontconfig: 字体配置库,用于处理字体管理,尤其在渲染字幕时。freetype: 一个开源的字体渲染库,用于在视频中添加文本或字幕。fribidi: 用于支持阿拉伯语和其他从右到左书写的语言,处理文本排版。gmp: 大整数计算库,通常用于处理高精度的数学运算(如加密、数字签名等)。gnutls: 安全传输协议库(TLS/SSL),为 FFmpeg 提供加密功能,支持安全的视频流传输。kvazaar: 高效的 HEVC/H.265 编解码器,用于视频编码。lame: MP3 编解码器库,允许 FFmpeg 编码和解码 MP3 格式的音频。libass: 用于字幕渲染,特别是 ASS/SSA 字幕格式。libiconv: 字符集转换库,帮助 FFmpeg 处理不同编码格式的文本。libilbc: iLBC(Internet Low Bitrate Codec)编解码器,常用于 VoIP(语音通信)。libtheora: 开源的视频编解码器,支持 Theora 格式视频。libvorbis: 一种开源音频编解码器,常用于 Ogg 格式的音频。libvpx: VP8/VP9 编解码器,Google 开发的用于视频流媒体的格式。libwebp: WebP 图像格式的支持库,用于处理 WebP 格式的图片。libxml2: XML 解析库,FFmpeg 用它来解析和处理 XML 数据,通常在处理流媒体协议时使用。opencore-amr: AMR(Adaptive Multi-Rate)音频编解码器,通常用于语音编码(例如移动通信中的语音通话)。opus: Opus 音频编解码器,广泛用于实时语音通信和高质量音频压缩。shine: MP3 编解码器库,较为轻量,用于较低复杂度的 MP3 编码。snappy: 数据压缩库,常用于快速压缩和解压数据。soxr: 高质量的音频重采样库,提供高精度的音频频率转换。speex: 一个开源音频编解码器,优化了语音压缩,适用于低比特率的语音通信。twolame: MP2 编解码器,常用于广播和音频文件编码。vid.stab: 视频稳定库,帮助减少视频中的抖动和不稳定画面。vo-amrwbenc: AMR-WB(宽带自适应多速率)音频编码器,通常用于更高质量的语音编码。x264: 开源的 H.264 视频编码器,广泛应用于视频流媒体和存储。x265: HEVC(H.265)视频编码器,提供比 H.264 更高的视频压缩效率。xvidcore: Xvid 编解码器库,用于 MPEG-4 视频压缩。zimg: 高质量的图像缩放库,支持多种图像缩放算法,主要用于提高视频处理中的图像质量。
如果要是编译符合full-gpl的ffmpeg-kit,需要如下命令,这里我直接用脚本编写好了。
#! /bin/bash# --disable-arm-v7a --disable-arm-v7a-neon --disable-x86 --disable-x86-64 --disable-arm64-v8aset -e./android.sh --enable-android-media-codec --enable-android-zlib \--enable-dav1d \--enable-fontconfig \--enable-freetype \--enable-fribidi \--enable-gmp \--enable-gnutls \--enable-kvazaar \--enable-lame \--enable-libass \--enable-libiconv \--enable-libilbc \--enable-libtheora \--enable-libvorbis \--enable-libvpx \--enable-libwebp \--enable-libxml2 \--enable-opencore-amr \--enable-opus \--enable-shine \--enable-snappy \--enable-soxr \--enable-speex \--enable-twolame \--enable-vo-amrwbenc \--enable-zimg \--enable-gpl --enable-libvidstab --enable-x264 --enable-x265 --enable-xvidcore \--disable-arm-v7a --disable-arm-v7a-neon --disable-x86 --disable-x86-64
上面的命令直接保存后,再通过 ./xxx.sh来执行。
当出现Creating Android archive under prebuilt: ok就代表编译成功。
需要注意的是,在使用这个手动打包获取的arr的时候,需要在自己的Android项目中的gradle脚本中引入:
// 手动打包需要自己手动添加下面的代码
api 'com.arthenica:smart-exception-java:0.1.1'
三. 总结
后续将基于该项目,尝试将gl-transition移植到ffmpeg中。编译的结果可以通过ffmpeg-kit-test来测试。
相关文章:
ffmpeg学习:ubuntu下编译Android版ffmpeg-kit
文章目录 前言一. 配置环境1.1 虚拟机版本1.2 安装Android环境1.2.1 Android SDK安装1.2.2 Android NDK安装 1.3 编译前的准备工作1.3.1 libtasn1-1安装1.3.2 meson安装1.3.3 harfbuzz下载 二. 编译ffmpeg-kit三. 总结 前言 ffmpeg-kit是一款跨多个平台的,用于在应…...
mydb:TM实现
一、说明 TM就是事务管理:实现对于事务的新增(active)、事务的状态修改(commit、abort)、事务的状态判断 二、事务管理 2.1创建xid文件/打开xid文件 创建xid、写一个空的 XID 文件头并创建TM public static Transac…...
神经缩放定律:涌现能力与神经元数量、参数数量、数据集大小以及训练所使用的计算量有关
大语言模型的神经缩放定律 大语言模型(LLMs)在自然语言处理领域取得了显著进展,这很大程度上得益于神经缩放定律。该定律指出,模型的损失与模型规模、数据集大小以及训练所使用的计算量呈幂律关系 ,随着模型参数、数据量等的增加,模型会展现出涌现能力,性能会有质的飞跃…...
Microsoft Porject常用字段描述
点击下载《Microsoft Porject常用字段描述》 1. 前言 Microsoft Project 是项目管理中不可或缺的工具,它通过丰富的列(字段)帮助项目经理全面跟踪和管理项目的各个方面。这些列名通常以简称的形式出现,如 ACWP、BCWP、BCWS 等&a…...
web前端开发中vscode常用的快捷键
1.快速复制一行 快捷键: shiftalt 下箭头(上箭头) 或者 ctrlc 然后 ctrlv 2.选定多个相同的单词 快捷键: ctrl d 先双击选定一个单词,然后按下 ctrl d 可以往下依次选择相同的单词。 这样同时修改相同的单词 3.全局替换某单词 当我们一个…...
鲲鹏(ARM64)升级GCC
1、下载压缩包 wget http://ftp.gnu.org/gnu/gcc/gcc-9.5.0/gcc-9.5.0.tar.xz2、解压 tar -xvf gcc-9.5.0.tar.xzcd gcc-9.5.03、下载关联软件 ./contrib/download_prerequisites4、新建文件夹 mkdir build && cd build5、配置 ../configure -enable-checkingrelea…...
国产操作系统安装DeepSeek
从年前到现在,DeepSeek这款语言AI模型,一经发布直接在全球爆火,在热搜上更是牢牢占据一席之地。无论是技术大神,还是紧跟潮流的技术小白,都被它强大的自然语言处理能力所吸引。作为国产操作系统的用户,千万…...
安科瑞 Acrel-2000ES:解锁储能管理新高度,引领能源未来!
安科瑞 崔丽洁 在能源转型的关键时期,高效的储能管理成为众多企业和项目的核心需求。今天,就给大家介绍一款储能管理的 “神器”—— 安科瑞 Acrel-2000ES 储能能量管理系统。 安科瑞电气可是行业内的 “明星企业”,2003 年成立,2…...
DeepSeek总是提示“服务器繁忙,请稍后再试。”的问题的解决办法(替代网站推荐)
文章目录 问题现象原因分析替代网站的可行性分析替代网站秘塔搜索超算互联网360 纳米AI助手百度云千帆字节跳动火山引擎阿里云PAI硅基流动其他文思助手Fireworks英伟达POE 问题现象 频繁遇到错误提示: 在使用DeepSeek时(开启“深度思考(R1&a…...
OpenBayes 教程上新 | 告别服务器繁忙,DeepSeek 一键部署教程上线!
近日,DeepSeek 的技术突破如同一颗横空出世的「科技烟花」,在全球范围内瞬间炸开。 日活跃用户数在短短 18 天内便突破 1500 万,增速达到 ChatGPT 的 13 倍。根据 SensorTower 数据显示,DeepSeek 应用的每日下载量接近 500 万&am…...
2024年12月中国电子学会青少年软件编程(Python)等级考试试卷(四级)
青少年软件编程(Python)等级考试试卷(四级) 一、单选题(共25题,共60分) 1.以下有关位置实参和关键字实参的表述中,错误的选项是?(C) A.位置实参和关键字实参可以混用。 B. 形参不占用内存地址。 C.调用函…...
三角拓扑聚合优化器TTAO-Transformer-BiLSTM多变量回归预测(Maltab)
三角拓扑聚合优化器TTAO-Transformer-BiLSTM多变量回归预测(Maltab) 完整代码私信回复三角拓扑聚合优化器TTAO-Transformer-BiLSTM多变量回归预测(Maltab) 一、引言 1、研究背景和意义 在现代数据科学领域,时间序列…...
日常知识点之面试后反思裸写string类
1:实现一个字符串类。 简单汇总 最简单的方案,使用一个字符串指针,以及实际字符串长度即可。 参考stl的实现,为了提升string的性能,实际上单纯的字符串指针和实际长度是不够了,如上,有优化方案…...
(2025)深度分析DeepSeek-R1开源的6种蒸馏模型之间的逻辑处理和编写代码能力区别以及配置要求,并与ChatGPT进行对比(附本地部署教程)
(2025)通过Ollama光速部署本地DeepSeek-R1模型(支持Windows10/11)_deepseek猫娘咒语-CSDN博客文章浏览阅读1k次,点赞19次,收藏9次。通过Ollama光速部署本地DeepSeek-R1(支持Windows10/11)_deepseek猫娘咒语https://blog.csdn.net/m0_70478643/article/de…...
zyNo.22
常见Web漏洞解析 命令执行漏洞 1.Bash与CMD常用命令 (1)Bash 读取文件:最常见的命令cat flag 在 Bash 中,cat 以及的tac、nl、more、head、less、tail、od、pr 均为文件读取相关命令,它们的区别如下: …...
博客项目-day05(首页导航栏功能补全)
导航 其实之前已经实现过文章和标签分类了 但是这个对应的是导航栏的,多显示个图片 所以新增两个这个请求 文章分类 把之前的CategoryVo加个描述属性 写过这个copyList,直接用就行 标签分类 和上面的分类查询差不多 不多解释了 分类文章列表 点击这个后…...
防御保护-----前言
HCIE安全防御 前言 计算机病毒 蠕虫病毒----->具备蠕虫特性的病毒:1,繁殖性特别强(自我繁殖);2,具备破坏性 蠕虫病毒是一种常见的计算机病毒,其名称来源于它的传播方式类似于自然界中…...
力扣刷题(数组篇)
日期类 #pragma once#include <iostream> #include <assert.h> using namespace std;class Date { public:// 构造会频繁调用,所以直接放在类里面(类里面的成员函数默认为内联)Date(int year 1, int month 1, int day 1)//构…...
初一说明文:我的护眼灯
本文转自:AI范文助手网 原文链接:https://www.aazhushou.com/czzw/5023.html 自爱迪生发明了灯以来,各种各样的灯相继问世了,给人一种新景象,其中护眼灯也问世了。 我有一盏台灯叫麦迪格护眼灯。那天我和母亲去商场&…...
【论文阅读】Revisiting the Assumption of Latent Separability for Backdoor Defenses
https://github.com/Unispac/Circumventing-Backdoor-Defenses 摘要和介绍 在各种后门毒化攻击中,来自目标类别的毒化样本和干净样本通常在潜在空间中形成两个分离的簇。 这种潜在的分离性非常普遍,甚至在防御研究中成为了一种默认假设,我…...
超短脉冲激光自聚焦效应
前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应,这是一种非线性光学现象,主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场,对材料产生非线性响应,可能…...
UE5 学习系列(三)创建和移动物体
这篇博客是该系列的第三篇,是在之前两篇博客的基础上展开,主要介绍如何在操作界面中创建和拖动物体,这篇博客跟随的视频链接如下: B 站视频:s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...
蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练
前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1):从基础到实战的深度解析-CSDN博客,但实际面试中,企业更关注候选人对复杂场景的应对能力(如多设备并发扫描、低功耗与高发现率的平衡)和前沿技术的…...
五年级数学知识边界总结思考-下册
目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解:由来、作用与意义**一、知识点核心内容****二、知识点的由来:从生活实践到数学抽象****三、知识的作用:解决实际问题的工具****四、学习的意义:培养核心素养…...
基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解
JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用,结合SQLite数据库实现联系人管理功能,并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能,同时可以最小化到系统…...
在Ubuntu24上采用Wine打开SourceInsight
1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...
MFC 抛体运动模拟:常见问题解决与界面美化
在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...
Windows安装Miniconda
一、下载 https://www.anaconda.com/download/success 二、安装 三、配置镜像源 Anaconda/Miniconda pip 配置清华镜像源_anaconda配置清华源-CSDN博客 四、常用操作命令 Anaconda/Miniconda 基本操作命令_miniconda创建环境命令-CSDN博客...
Web中间件--tomcat学习
Web中间件–tomcat Java虚拟机详解 什么是JAVA虚拟机 Java虚拟机是一个抽象的计算机,它可以执行Java字节码。Java虚拟机是Java平台的一部分,Java平台由Java语言、Java API和Java虚拟机组成。Java虚拟机的主要作用是将Java字节码转换为机器代码&#x…...
Golang——9、反射和文件操作
反射和文件操作 1、反射1.1、reflect.TypeOf()获取任意值的类型对象1.2、reflect.ValueOf()1.3、结构体反射 2、文件操作2.1、os.Open()打开文件2.2、方式一:使用Read()读取文件2.3、方式二:bufio读取文件2.4、方式三:os.ReadFile读取2.5、写…...
