You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity中链接C++ dylib时出现未定义符号错误(iOS平台)

解决Unity iOS平台调用C头文件dylib库的未定义符号错误

问题场景

需求:在Unity中调用基于C头文件的dylib库,目标平台为iOS。
已执行操作:

  • 将dylib放置在Assets/Plugins/iOS目录下
  • 针对iOS平台使用__Internal作为动态库名称,代码如下:
    #if (UNITY_IPHONE && !UNITY_EDITOR) || (UNITY_WEBGL && !UNITY_EDITOR)
        public const String __DllName="__Internal";
    #else
        const string __DllName = "voicevox_core";
    #endif
    

报错:dylib中的所有函数均提示未定义符号错误。


排查与解决步骤

1. 验证dylib的架构兼容性

iOS设备使用ARM64架构,需确保你的dylib是针对iOS ARM64编译的(注意区分macOS的ARM64架构,二者不兼容)。
通过终端命令查看dylib架构信息:

lipo -info your_dylib_name.dylib

输出需包含arm64,且不能包含仅macOS的架构(如x86_64、arm64e)。

2. 配置Unity中dylib的平台属性

选中Assets/Plugins/iOS下的dylib文件,在Inspector面板设置:

  • Platform Settings:仅勾选iOS
  • Include in Build:勾选
  • CPU:选择ARM64

3. 确认C函数的符号导出正确性

如果dylib由C编译,必须用extern "C"包裹函数声明,避免C名字修饰导致符号不匹配:

#ifdef __cplusplus
extern "C" {
#endif

// 此处放置你的C函数声明
void voicevox_some_function();
int voicevox_get_value();

#ifdef __cplusplus
}
#endif

用终端命令查看dylib导出的符号,确认和C#中声明的函数名一致:

nm -g your_dylib_name.dylib

4. 检查C#函数声明的准确性

C#中的DllImport声明必须和C头文件完全匹配,包括函数名、参数类型、返回值类型:

[DllImport(__DllName)]
public static extern void voicevox_some_function();

[DllImport(__DllName)]
public static extern int voicevox_get_value();

注意C语言区分大小写,函数名必须完全一致。

5. 调整Unity iOS构建设置

  • 打开Unity的Player Settings → iOS → Other Settings
  • 设置Scripting Backend为IL2CPP(iOS平台推荐使用,兼容性更好)
  • 确认Architecture为ARM64
  • 如果dylib依赖系统框架(如AudioToolbox、CoreFoundation),需在Linker Flags中添加对应链接参数,例如:
    -framework AudioToolbox -framework CoreFoundation
    

内容的提问来源于stack exchange,提问作者musako

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 14:02:16