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
相关产品推荐
相关产品推荐

