简介:面向音频插件开发者与数字音频工作站生态的学习者,这份VST 3 SDK资源包提供在Windows、macOS、Linux与iOS上构建VST 3插件所需的基础材料,适合已具备C++与音频处理概念、希望理解插件与宿主通信机制的中高级开发者。压缩包共7个文件,以PDF许可与使用指南、txt说明、md文档及html索引页为主,整体约405KB,体量轻便,便于先梳理协议条款、目录入口和构建线索,再结合子模块与CMake配置深入源码。已有1380人学习下载。其价值在于围绕VST 3的模块化架构展开:可据此了解IProcessor、IEditController与IController的分工,认识实时音频环境下的多线程处理要求,并梳理参数ID、自动化映射、自定义UI与宿主兼容性等关键概念;配合SDK中的库文件、头文件、示例代码和文档,能帮助读者建立跨平台插件开发的知识框架,并为后续编译、调试与功能扩展提供参照。
1. 一套 VST 3 SDK,我在三台机器上装出了三种结果
第一次拉 vst3sdk 是在一台 Windows 工作站上,clone 完直接进目录cmake ..,报错只有一句——找不到public.sdk/CMakeLists.txt。我以为是 CMake 版本不对,卸了装、装了卸折腾三回,最后发现是克隆时没带--recursive,四个子模块目录全是空的。后来在 macOS 和 Linux 上又各翻一次车:macOS 卡在 Xcode 许可证没同意,Linux 卡在一堆 xcb 开发包没装。这套环境本身不难,但它把 CMake、编译器、平台开发包、git 子模块全绑在一条链上,任何一环没对齐,编出来的东西就是一个黑匣子——日志看不出原因,宿主也认不出来。这篇按我实际安装的顺序写,win32、macOS、Linux 三平台的差异单独标出来,iOS 那一段只说需要额外注意的地方。适合有 C++ 工程基础、但第一次碰 VST 3 plugins 开发的人。
2. 环境清点:编译器、CMake 与平台开发包怎么对齐
装 vst3sdk 之前先把三样东西对齐:编译器版本、CMake 版本、平台原生开发包。这三样任意一个不达标,后面的编译命令都会给你一个模棱两可的失败。我一般不在报错之后再回头补,而是在动手前先花五分钟把这几个版本号打出来看一遍,省下的时间比这五分钟多得多。
2.1 三平台编译器与工具链的最低配置
Windows 这边走 MSVC。安装 Visual Studio 的时候必须勾上「使用 C++ 的桌面开发」这个工作负载,只装一个空壳 IDE 是不够的,cl.exe、Windows SDK、CMake 集成都在这个工作负载里。装完之后在「x64 Native Tools Command Prompt」里敲cl,能打出编译器版本号才算数。别在普通 cmd 里试,环境变量没加载,会误判成没装。
macOS 这边走 Xcode Command Line Tools。xcode-select --install会弹窗装一套轻量工具链,装完还要sudo xcodebuild -license accept把许可协议过一遍。这一步特别容易被跳过,跳过之后的表现不是「报许可证错误」,而是编译到一半某个xcrun调用莫名其妙失败,日志里看不出跟许可证有关,属于典型的玄学现场。
Linux 这边 GCC 和 Clang 都行,用发行版自带的那个就好,别自己去编译一个最新版,反而容易和系统库的 ABI 对不上。gcc --version和clang --version随便哪个能打出版本号就可以往下走。
提示:三个平台都不要用太老的工具链。VST 3 SDK 里用了不少 C++17 的特性,编译器太老会在模板展开阶段报一堆看不懂的错,比缺头文件还难查。
2.2 CMake 版本与生成器的选择
CMake 是这套环境的主心骨,版本我给一个保守建议:3.20 以上。实际的最低要求以仓库顶层CMakeLists.txt里那一行cmake_minimum_required(VERSION ...)为准,装之前先打开看一眼,比照着任何博客抄都靠谱。
生成器的选择上,这里有个分水岭,也是我见过最多人踩的坑:
| 平台 | 推荐生成器 | 配置类型 |
|---|---|---|
| Windows | Visual Studio 17 2022(多配置) | 编译时用--config Release指定 |
| macOS | Ninja或Unix Makefiles(单配置) | 配置时必须显式写CMAKE_BUILD_TYPE |
| Linux | Ninja或Unix Makefiles(单配置) | 配置时必须显式写CMAKE_BUILD_TYPE |
多配置生成器在配置阶段根本不需要CMAKE_BUILD_TYPE,编译时用--config传就行。单配置生成器则相反,配置阶段不写CMAKE_BUILD_TYPE,CMake 会给你一个空配置,编译照样能过,但生成出来的插件在 validator 里行为异常,而且报错指向完全无关的地方。这种「编得过、跑不对」的情况,排查成本比直接编译失败高一个量级。
Ninja 需要单独装。Linux 上sudo apt install ninja-build,macOS 上brew install ninja。不装也行,把生成器换成Unix Makefiles,后面的命令里-j参数一样有效。
2.3 Linux 平台开发包清单
Linux 是三个平台里前置依赖最多的一个。VST 3 SDK 自带一个 VSTGUI 的 GUI 层,这一层直接依赖 X11、xcb、GTKmm、freetype 这一串系统库,缺一个就在 CMake 配置阶段直接失败。常见的做法是一次性把这些包装齐:
# Debian / Ubuntu 系,VSTGUI 依赖的 X11 与 xcb 开发包 sudo apt update sudo apt install -y build-essential cmake ninja-build git \ libx11-dev libxcb-util-dev libxcb-cursor-dev \ libxcb-keysyms1-dev libxcb-xkb-dev \ libxkbcommon-dev libxkbcommon-x11-dev \ libgtkmm-3.0-dev libfreetype6-dev libfontconfig1-dev \ libcurl4-openssl-dev这段命令里前面几个是基础工具链,从libx11-dev往后的都是 VSTGUI 的硬依赖。libxcb-cursor-dev在比较新的发行版上包名可能略有差异,装不上就apt search xcb-cursor查一下,别硬扛。libcurl4-openssl-dev是给 SDK 里部分网络相关的示例用的,不做那部分也能编,但装了更省心。
Fedora / RHEL 系对应的包名是libX11-devel、xcb-util-devel、xcb-util-cursor-devel、xcb-util-keysyms-devel、xcb-util-xkb-devel、libxkbcommon-devel、libxkbcommon-x11-devel、gtkmm30-devel、freetype-devel、fontconfig-devel、libcurl-devel,逻辑一致。
如果你只想要命令行插件、明确不打算用 VSTGUI,可以在配置阶段把 GUI 支持关掉,Linux 上那堆 X11 依赖就全都不需要了。配置开关的细节放到第 4 章去讲。
3. 拉取 vst3sdk:子模块、目录结构与第一次落盘
SDK 本身是一个 git 仓库,但它不是一个自包含的仓库——真正的源码分散在若干个子模块里。这个设计是后面所有「找不到文件」类报错的根源,所以拉取这一步必须做对,没有商量的余地。
3.1 带子模块的克隆方式
正确的克隆命令只有一条,但那个参数不能漏:
# --recursive 是关键:它会连带把 cmake、public.sdk、 # pluginterfaces、vstgui4 这几个子模块一起拉下来 git clone --recursive https://github.com/steinbergmedia/vst3sdk.git cd vst3sdk--recursive的意思是克隆主仓库之后,继续进入每一个子模块目录,按.gitmodules里登记的地址再克隆一遍。不加这个参数,主仓库的文件是全的,但public.sdk/、pluginterfaces/、vstgui4/、cmake/这几个目录会是空壳,进去ls什么都没有。
已经在没带参数的情况下克隆过了也不用重新拉。在仓库根目录补一条:
# 已经 clone 过但目录空着,用这条补齐 git submodule update --init --recursive--init负责把.gitmodules里登记的子模块注册到本地配置,--recursive负责处理嵌套子模块(子模块里还有子模块的情况)。VSTGUI 那部分就有嵌套,少一个参数会漏。补完之后用git submodule status确认,每一行前面都有个哈希值、没有-前缀,才算全部到位。
注意:国内网络环境下这几个子模块的拉取速度可能很慢。别在拉到一半的时候按 Ctrl+C,中断会留下半截的 git 状态,后面再
update会报「工作区不干净」。真中断了,先在对应子模块目录里git checkout .清一下再重试。
3.2 目录结构认一遍再动手
克隆完整之后,根目录大致是这么几个东西,花两分钟认一遍,后面看报错能快很多:
public.sdk/—— 这是最核心的一块。示例插件的源码、宿主示例、还有官方的validator插件校验器,都在这里面。CMake 找不到public.sdk/CMakeLists.txt,八成就是子模块没拉下来。pluginterfaces/—— VST 3 和 VSTGUI 的纯接口头文件。vst/下面那些ivstaudioprocessor.h、ivstcomponent.h就是写插件时天天要 include 的东西。这一层不包含实现,只有接口定义。vstgui4/—— VSTGUI 图形界面库。做带界面的音频插件绕不开它,也是 Linux 上那一长串依赖的真正来源。只做纯参数插件的话可以不编译它。cmake/—— Steinberg 自己封装的 CMake 模块。很多SMTG_开头的开关和宏都是在这里定义的,遇到不认识的 CMake 变量就来这里 grep。doc/—— 文档目录,README.md之外还有一份 VST 3 的接口说明,比在头文件里瞎翻高效。
再强调一次:public.sdk和pluginterfaces是必须有的,缺任何一个,CMake 配置阶段会直接中断。vstgui4只在开了 GUI 支持的时候才被引用。
3.3 构建目录的约定
不要在源码树里直接cmake .。CMake 会在源码目录生成CMakeCache.txt、CMakeFiles/一堆东西,把 git 状态搅得一团乱,之后想切分支或者清理都得手动删。
我固定用同级或下一级的build目录,并且按用途分开:
# 在 vst3sdk 根目录下创建独立构建目录 mkdir -p build/release cd build/release分开建目录的好处是排错的时候可以随时rm -rf build/release重来,不影响别的构建配置。调参数调崩了、缓存脏了、换了生成器,全都不用去猜CMakeCache.txt里残留了什么,直接删目录重配,比逐行排查缓存快得多。后悔药就是那个rm -rf。
4. CMake 配置与编译:开关、生成器与三平台命令
配置阶段是整条链上最值得慢下来的一步。命令敲下去之后 CMake 会打一大段输出,里面藏着「哪些模块没找到」「哪个开关被默认打开了」。很多人习惯性地滚过去直接编译,结果错误信息出现在编译阶段,其实根因在配置阶段就已经打出来了。
4.1 核心开关:示例插件、VSTGUI 与 validator
SDK 里的开关都用SMTG_前缀,先自己 grep 一遍,比记任何清单都准:
# 在 vst3sdk 根目录执行,列出所有对外暴露的开关 grep -rn "option(SMTG" CMakeLists.txt cmake/ 2>/dev/null常用的几个我按用途列一下,具体名字以你拉下来的那个版本为准:
| 开关 | 典型默认值 | 作用 |
|---|---|---|
SMTG_ENABLE_VST3_PLUGIN_EXAMPLES | ON | 编译public.sdk/samples/vst下的示例插件 |
SMTG_ENABLE_VST3_HOSTING_EXAMPLES | ON | 编译宿主示例,验证插件能不能被加载 |
SMTG_ENABLE_VSTGUI_SUPPORT | ON | 启用 VSTGUI,关掉后 Linux 的 X11 依赖全部消失 |
SMTG_RUN_VST_VALIDATOR | ON | 编译完成后自动跑一遍 validator |
CMAKE_BUILD_TYPE | 空 | 单配置生成器必须显式指定 |
第一次装,我的建议是示例插件和 validator 都留着,宿主示例可以关。示例插件是你验证整条链通没通的唯一抓手,validator 是第 6 章要做验证的工具,关了就得自己再配一遍。宿主示例编译耗时长、依赖也更多,第一次装没必要。
做纯命令行插件、界面上不需要任何图形控件的,把 VSTGUI 关掉能省掉一大块编译时间和平台依赖。但要注意:关掉之后 SDK 里那些带界面的示例插件也会一起不编,你得换一个纯参数的示例来验证。
4.2 Windows 与 macOS 的配置命令
Windows 走 Visual Studio 生成器,配置阶段不需要管构建类型:
# 在 vst3sdk 根目录执行,-A x64 显式指定目标架构 cmake -S . -B build/release -G "Visual Studio 17 2022" -A x64 # 编译,Release 配置在这一步才指定 cmake --build build/release --config Release -j 8-S .指定源码目录是当前目录,-B build/release指定构建目录,这两个参数把「在哪里构建」和「源码在哪」彻底解耦,是现代 CMake 的推荐写法。-A x64只在 Visual Studio 生成器下有效,不写的话默认可能给你 x86 或者 Win32,编出来的插件在 64 位宿主里根本加载不上,而且宿主不会告诉你原因。--config Release是给多配置生成器的,Debug 版本体积大、跑得慢,还要额外拷调试运行时,第一次装统一用 Release。
macOS 走 Ninja,必须显式给构建类型:
# macOS,单配置生成器必须写 CMAKE_BUILD_TYPE cmake -S . -B build/release -G Ninja \ -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_OSX_ARCHITECTURES=arm64 cmake --build build/release -j 8-DCMAKE_OSX_ARCHITECTURES在 Apple Silicon 机器上写arm64,Intel 机器写x86_64,两边都要跑就写arm64;x86_64编成通用二进制——代价是编译时间翻倍。建议第一次装先编单架构把流程跑通,确认能加载之后再考虑通用二进制。
提示:macOS 上如果 CMake 报「找不到编译器」,九成是
xcode-select -p指到了 CommandLineTools 而不是完整的 Xcode 路径。先xcode-select -p看一眼,不对就sudo xcode-select -s /Applications/Xcode.app/Contents/Developer重新指。
iOS 这一段单独提一句。给 iOS 编译走的是同一套 CMake,但要换CMAKE_SYSTEM_NAME=iOS和对应的 sysroot,VSTGUI 那层也需要额外开 iOS 相关的支持开关。桌面开发阶段可以先完全不管,等桌面能验证通过了再回过头处理,免得一上来就被平台参数卡住。
4.3 Linux 的配置与编译
Linux 上我做纯音频插件时常把宿主示例关掉,第一次装也建议这么干,能少一大半依赖:
# Linux,关闭宿主示例以减少依赖,其余保持默认 cmake -S . -B build/release -G Ninja \ -DCMAKE_BUILD_TYPE=Release \ -DSMTG_ENABLE_VST3_HOSTING_EXAMPLES=OFF cmake --build build/release -j "$(nproc)"-j "$(nproc)"让 make/ninja 按 CPU 核心数并行,比写死-j 8更省心。Linux 上如果上一章那套 X11 包装齐了,配置阶段应该能一路绿到底;如果报Could NOT find X11之类,回到 2.3 节对着包名补,别在这里试图用-D参数绕过,绕过去编译到链接阶段照样炸。
编译跑完之后,用echo $?确认返回码是 0。CMake 有一个麻烦的地方:某些错误在并行编译下会被淹没在大量输出里,只看最后几行容易漏掉,返回码是最可靠的判断依据。
4.4 产物落在哪
编译成功之后,插件产物在构建目录的bin/下面,具体路径各平台不同:
# 找一下编出来的 .vst3 在哪 find build/release -name "*.vst3" -maxdepth 4Windows 下大概是build/release/bin/Release/里的一批目录,每个插件一个.vst3文件夹,里面是.vst3DLL 加Resources。macOS 下是一个个.vst3包(本质是目录),里面有Contents/MacOS/。Linux 下同样是目录形态,里面是.so。
找到之后先别急着往宿主里拷。下一章要讲的几个坑,基本都是在「编译成功了、插件也找到了、但就是加载不了」这个阶段爆出来的。
5. 避坑与常见问题排查:五个装完才发现的问题
这几条都是我自己或者身边人真实撞过的,按「现象 → 原因 → 解决」记,顺序按出现频率排。
5.1 克隆完子模块目录是空的
现象:cmake -S . -B build/release报错add_subdirectory given source "public.sdk" which is not an existing directory,或者CMake Error at CMakeLists.txt:xx: File not found。进public.sdk目录ls发现什么都没有。
原因:克隆时没带--recursive。主仓库的文件是全的,但.gitmodules里登记的四个子模块都没被初始化,目录被创建了却是空的。
解决:在根目录执行git submodule update --init --recursive,再用git submodule status确认每一行前缀都是哈希值而非-。已经开始编译的,删掉build/release重新配置,CMake 缓存里记的路径需要重置。
5.2 CMake 配置过了,编译却「什么都没生成」
现象:cmake --build一路绿到底,返回码 0,但find . -name "*.vst3"什么都找不到。
原因:单配置生成器没写CMAKE_BUILD_TYPE。CMake 会使用一个空的构建类型,某些目标在这种配置下被跳过或者产出到意料之外的目录。这是最典型的「编得过但不生效」。
解决:确认用的是 Ninja 或 Unix Makefiles,就在配置命令里补-DCMAKE_BUILD_TYPE=Release。然后删掉构建目录重新配置——改缓存不如重建目录干净,缓存里的旧值很容易残留。
5.3 Linux 下配置阶段一堆 X11 / xcb 找不到
现象:Could NOT find X11 (missing: X11_X11_INCLUDE_PATH X11_X11_LIB),或者Package 'xkbcommon' not found,配置直接中断。
原因:VSTGUI 依赖的系统开发包没装。注意是-dev/-devel结尾的开发包,只装运行时的.so是不够的,CMake 找的是头文件和.pc文件。
解决:回到 2.3 节按包名补装。补完之后必须删掉构建目录重新配置,CMake 不会自动重新探测已经失败过的依赖。
5.4 macOS 上编译到一半被许可证挡下来
现象:配置阶段正常,编译前期也正常,到某个需要调用xcrun的步骤突然失败,报错信息里看不出和许可证有任何关系。
原因:Xcode 许可协议没同意。Command Line Tools 装完了但协议没 accept,部分工具在没有协议同意的状态下会静默失败。
解决:sudo xcodebuild -license accept,然后sudo xcodebuild -runFirstLaunch补齐组件。执行完用xcode-select -p确认路径,再重新配置一次。这类问题没有明确的报错提示,属于血泪经验。
5.5 validator 跑不起来或报找不到插件
现象:编译产物明明在,validator 一跑就报Plugin not found或者直接以非 0 退出码结束。
原因:给的路径不对。VST 3 插件在 macOS 和 Linux 上是目录形态的 bundle,要传的是那个.vst3目录本身的路径,而不是进到里面找.so或可执行文件。
解决:传绝对路径,并且指向.vst3那一级。不确定的话,用find找出来的完整路径直接pwd拼上去,别用相对路径。下一章细说验证流程。
6. 装完怎么验证:validator 加宿主两步走通
编译通过不等于装好了。我一直用两步验证,少一步都不算完。
第一步,用 SDK 自带的 validator。它不依赖任何宿主,纯命令行就能跑,是判断插件结构是否合规最快的办法:
# 找到 validator 的可执行文件,第一次装建议先定位再跑 find build/release -type f -name "validator" -perm -u+x # 传 .vst3 bundle 的绝对路径,不是里面的 .so ./build/release/bin/Release/validator \ "$(pwd)/build/release/bin/Release/adelay.vst3"输出里会逐项列出组件信息、音频处理、总线布局等检查结果。全部通过会有一个明确的成功提示;只要有一项 fail,后面就别往下走了,先回去看那一项对应的错误。
第二步,扔进真正的宿主里。validator 查的是规范合规性,宿主查的是实际加载行为,两者不完全等价。把.vst3拷到系统标准的插件目录——Windows 是C:\Program Files\Common Files\VST3,macOS 是~/Library/Audio/Plug-Ins/VST3,Linux 是~/.vst3——然后让宿主重新扫描。
| 平台 | 插件目录 | 备注 |
|---|---|---|
| Windows | C:\Program Files\Common Files\VST3 | 需要管理员权限写入 |
| macOS | ~/Library/Audio/Plug-Ins/VST3 | 用户级目录,不需要 sudo |
| Linux | ~/.vst3 | 目录不存在就手动建 |
能扫到、能打开界面、能出声音,三件事都成立才算真正跑通。我见过 validator 全绿但宿主里打不开界面的情况,也见过宿主能加载但 validator 报总线布局不符的情况,所以两步都得走。
从那以后我每次装新机器,都是先git submodule status确认子模块,再cmake --version确认版本,最后validator --version确认工具链齐了,才敢敲第一条配置命令。这三个检查加起来不到一分钟,能挡掉后面两小时的排查。希望帮到你。
本文还有配套的精品资源,点击获取