macOS Framework 使用指南(面向 Linux 开发者)以火山引擎实时音视频 SDK 为例 - 教程
macOS Framework 使用指南(面向 Linux 开发者)以火山引擎实时音视频 SDK 为例
概述
本文档面向有 Linux 开发经验但初次接触 macOS 开发的开发者,以火山引擎 SDK 为例,详细解释 macOS Framework 格式及其使用方法。
获取火山引擎 SDK
火山引擎实时音视频 SDK 可以从以下地址下载:
macOS 版本 SDK 包含:
- Framework 格式的主库和扩展库
- 独立的 dylib 文件
- 头文件和资源文件
什么是 Framework?
Framework 是 macOS/iOS 平台特有的库打包格式,它将库的二进制文件、头文件、资源文件等组织在一个目录结构中。可以把它理解为 Linux 中 .so 文件 + 头文件 + 资源文件的"打包版本"。
Linux vs macOS 库格式对比
| 特性 | Linux | macOS |
|---|---|---|
| 库文件格式 | .so (Shared Object) | .framework (目录) 或 .dylib (Dynamic Library) |
| 头文件位置 | 通常单独存放在 include/ 目录 | 可以包含在 Framework 内部 |
| 资源文件 | 需要单独管理 | 可以包含在 Framework 内部 |
| 版本管理 | 通过文件名(如 libfoo.so.1.0) | 通过 Framework 的 Versions/ 目录 |
| 链接方式 | 直接链接 .so 文件路径 | 链接 Framework 路径或使用 -framework 标志 |
Framework 目录结构详解
以火山引擎 SDK 的 VolcEngineRTC.framework 为例:
VolcEngineRTC.framework/
├── VolcEngineRTC # 符号链接 -> Versions/Current/VolcEngineRTC
├── Headers # 符号链接 -> Versions/Current/Headers
├── Modules # 符号链接 -> Versions/Current/Modules
├── Resources # 符号链接 -> Versions/Current/Resources
└── Versions/
├── Current # 符号链接 -> 3 (指向当前版本)
└── 3/ # 版本 3 的实际内容
├── VolcEngineRTC # 实际的二进制库文件 (Mach-O 动态库)
├── Headers/ # 头文件目录
│ ├── native/ # C++ 头文件
│ │ ├── bytertc_engine.h
│ │ ├── bytertc_room.h
│ │ └── rtc/
│ │ ├── bytertc_defines.h
│ │ └── ...
│ └── objc/ # Objective-C 头文件(macOS/iOS 专用)
├── Modules/ # 模块定义文件
│ └── module.modulemap
└── Resources/ # 资源文件
├── AUDIO_MODEL/ # 音频模型文件
└── basic_beauty/ # 美颜相关资源
关键组件说明
- VolcEngineRTC:实际的二进制库文件(类似 Linux 的
.so文件) - Headers/:头文件目录(类似 Linux 的
include/目录) - Resources/:资源文件(模型、配置文件等,Linux 通常需要单独管理)
- Versions/:版本管理目录,支持多版本共存
- 符号链接:顶层目录通过符号链接指向当前版本,方便访问
火山引擎 SDK:Linux vs macOS 对比
Linux 版本结构
your_project/
└── third_party/
└── volc_engine_rtc/
├── include/ # 头文件目录
│ ├── bytertc_engine.h
│ ├── bytertc_room.h
│ └── rtc/
│ └── ...
└── lib/
└── linux-x86_64/ # 库文件目录
├── libVolcEngineRTC.so # 主库
├── libRTCFFmpeg.so # FFmpeg 扩展
├── libbytertc_vp8codec_extension.so
├── libbytertc_nico_extension.so
├── libbytertc_ffmpeg_audio_extension.so
├── libbytertc_fdk-aac_extension.so
└── libbytenn.so
macOS 版本结构
your_project/
└── third_party/
└── volc_engine_rtc/
├── include/ # 头文件目录(可选,Framework 内也有)
│ └── ... # 与 Linux 版本相同
└── lib/
└── macosx/
└── arm64/ # 架构目录
├── VolcEngineRTC.framework/ # 主 Framework
├── RTCFFmpeg.framework/ # FFmpeg Framework
├── ByteRTCVp8CodecExtension.framework/
├── ByteRTCNICOExtension.framework/
├── ByteRTCFFmpegAudioExtension.framework/
├── ByteRTCFDK-AACExtension.framework/
├── libbytenn.dylib # 独立的动态库
├── libbdaudioeffect.dylib
├── libbytevc0.dylib
└── libeffect.dylib
关键差异
库文件格式:
- Linux:
.so文件(单个文件) - macOS:
.framework目录(包含二进制、头文件、资源)
- Linux:
扩展库:
- Linux: 所有扩展都是
.so文件 - macOS: 部分扩展是 Framework,部分仍是
.dylib文件
- Linux: 所有扩展都是
头文件:
- Linux: 统一放在
include/目录 - macOS: Framework 内部有头文件,
include/目录作为备选
- Linux: 统一放在
在 CMake 中使用 Framework
基本用法
CMake 可以直接识别 Framework 路径格式,无需特殊处理:
# 方式1:直接使用 Framework 路径(推荐)
target_link_libraries(my_target
${VOLC_FULL_LIB_DIR}/VolcEngineRTC.framework
)
# 方式2:使用 -framework 标志(需要先设置搜索路径)
target_link_directories(my_target PRIVATE ${VOLC_FULL_LIB_DIR})
target_link_libraries(my_target -framework VolcEngineRTC)
实际配置示例
# 设置第三方库目录
set(THIRD_PARTY_DIR ${CMAKE_CURRENT_SOURCE_DIR}/third_party)
set(VOLC_SDK_DIR ${THIRD_PARTY_DIR}/volc_engine_rtc)
# 检测平台
if(CMAKE_HOST_APPLE)
# macOS 平台
if(CMAKE_SYSTEM_PROCESSOR MATCHES "arm64")
set(VOLC_LIB_DIR ${VOLC_SDK_DIR}/lib/macosx/arm64)
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64")
set(VOLC_LIB_DIR ${VOLC_SDK_DIR}/lib/macosx/x86_64)
endif()
set(VOLC_USE_FRAMEWORK TRUE)
elseif(UNIX AND NOT APPLE)
# Linux 平台
if(CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64")
set(VOLC_LIB_DIR ${VOLC_SDK_DIR}/lib/linux-x86_64)
elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64")
set(VOLC_LIB_DIR ${VOLC_SDK_DIR}/lib/linux-aarch64)
endif()
set(VOLC_USE_FRAMEWORK FALSE)
endif()
# 创建 INTERFACE target
add_library(volc_engine_sdk INTERFACE)
# 设置头文件路径
if(VOLC_USE_FRAMEWORK)
# macOS: 使用 Framework 内的头文件
target_include_directories(volc_engine_sdk INTERFACE
${VOLC_LIB_DIR}/VolcEngineRTC.framework/Versions/3/Headers/native
${VOLC_SDK_DIR}/include # 备选路径
)
else()
# Linux: 使用独立的 include 目录
target_include_directories(volc_engine_sdk INTERFACE
${VOLC_SDK_DIR}/include
)
endif()
# 链接库文件
if(VOLC_USE_FRAMEWORK)
# macOS: 链接 Framework 和 dylib
target_link_libraries(volc_engine_sdk INTERFACE
# 主 Framework
${VOLC_LIB_DIR}/VolcEngineRTC.framework
# 扩展 Frameworks
${VOLC_LIB_DIR}/RTCFFmpeg.framework
${VOLC_LIB_DIR}/ByteRTCVp8CodecExtension.framework
${VOLC_LIB_DIR}/ByteRTCNICOExtension.framework
${VOLC_LIB_DIR}/ByteRTCFFmpegAudioExtension.framework
${VOLC_LIB_DIR}/ByteRTCFDK-AACExtension.framework
# 独立的 dylib 文件
${VOLC_LIB_DIR}/libbytenn.dylib
${VOLC_LIB_DIR}/libbdaudioeffect.dylib
${VOLC_LIB_DIR}/libbytevc0.dylib
${VOLC_LIB_DIR}/libeffect.dylib
)
else()
# Linux: 链接 .so 文件
target_link_libraries(volc_engine_sdk INTERFACE
${VOLC_LIB_DIR}/libVolcEngineRTC.so
${VOLC_LIB_DIR}/libRTCFFmpeg.so
${VOLC_LIB_DIR}/libbytertc_vp8codec_extension.so
${VOLC_LIB_DIR}/libbytertc_nico_extension.so
${VOLC_LIB_DIR}/libbytertc_ffmpeg_audio_extension.so
${VOLC_LIB_DIR}/libbytertc_fdk-aac_extension.so
${VOLC_LIB_DIR}/libbytenn.so
)
endif()
# 在你的目标中使用
target_link_libraries(your_target PRIVATE volc_engine_sdk)
Framework vs dylib
macOS 支持两种动态库格式:
Framework(推荐用于第三方 SDK)
- 格式:目录结构
- 优点:
- 自包含(二进制 + 头文件 + 资源)
- 支持版本管理
- 符合 macOS 开发规范
- 使用场景:第三方 SDK(如火山引擎 SDK)
dylib(类似 Linux 的 .so)
- 格式:单个文件
- 优点:
- 简单直接
- 与 Linux
.so类似
- 使用场景:系统库、简单的动态库
注意:火山引擎 SDK 同时使用了两种格式:
- 主库和扩展库使用 Framework
- 部分辅助库(如
libbytenn.dylib)使用 dylib
常见问题
Q1: Framework 是文件还是目录?
A: Framework 是一个目录,虽然看起来像文件扩展名。在文件系统中,VolcEngineRTC.framework 是一个目录,不是单个文件。
Q2: 如何查看 Framework 的内容?
# 查看 Framework 结构
ls -la VolcEngineRTC.framework/
# 查看 Framework 内的二进制文件
file VolcEngineRTC.framework/VolcEngineRTC
# 查看 Framework 的依赖
otool -L VolcEngineRTC.framework/VolcEngineRTC
Q3: Framework 和 .dylib 可以混用吗?
A: 可以。在 CMake 中,可以同时链接 Framework 和 dylib:
target_link_libraries(my_target
${LIB_DIR}/SomeFramework.framework
${LIB_DIR}/libsome.dylib
)
Q4: 为什么 macOS SDK 使用 Framework 而不是 dylib?
A: Framework 的优势:
- 自包含:头文件和资源文件都包含在内
- 版本管理:通过
Versions/目录支持多版本 - 资源管理:可以包含模型文件、配置文件等
- Apple 推荐:符合 macOS/iOS 开发规范
Q5: 如何在代码中使用 Framework?
A: 使用方式与 Linux 完全相同,因为头文件路径已经配置好了:
// 在 CMake 中已经配置了头文件路径,直接 include 即可
#include "bytertc_engine.h"
#include "rtc/bytertc_defines.h"
// 使用方式与 Linux 版本完全相同
auto engine = bytertc::createRTCVideoEngine();
总结
对于 Linux 开发者来说,理解 Framework 的关键点:
- Framework = 目录:不是单个文件,而是一个包含二进制、头文件、资源的目录结构
- 使用方式类似:在 CMake 中链接 Framework 路径,就像链接
.so文件路径一样 - 头文件路径:Framework 内部有头文件,需要配置正确的 include 路径
- 混合使用:可以同时使用 Framework 和 dylib
- 版本管理:通过
Versions/目录支持多版本共存
记住:Framework 就是 macOS 版本的"库打包格式",功能上等价于 Linux 的 .so 文件 + include/ 目录 + 资源文件的组合。

浙公网安备 33010602011771号