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

将CMake生成的共享Framework嵌入iOS应用时遇dyld加载失败问题

解决CMake生成的iOS Framework嵌入后dyld加载失败问题

嘿,这个问题我之前也踩过坑!你猜的完全没错,根源就是dylib的install name(也就是常说的dylib ID)设置不对。我给你一步步拆解清楚:

先搞懂什么是dylib ID?

动态库(包括Framework里的二进制文件)自身会记录一个「安装路径」,也就是install name。当你的app启动时,系统的dyld加载器会根据这个路径去查找库。你现在的问题是,CMake生成的Framework把install name设成了你本地构建机器的绝对路径/Users/jones/Documents/project/build/ios/foo.framework/foo,但设备上根本没有这个路径,自然就报"image not found"了。

而iOS app里嵌入的Framework,正确的install name应该是相对路径,格式是@rpath/foo.framework/foo,这样dyld会通过app的运行时搜索路径找到它。

验证当前的install name

先确认你的Framework确实是这个问题,打开终端执行:

otool -D /path/to/your/built/foo.framework/foo

如果输出是你本地的绝对路径,那实锤就是这个问题了。

解决方法

方法1:在CMake里直接配置(推荐)

修改你的CMakeLists.txt,给目标库添加必要的属性,让CMake生成符合iOS要求的Framework:

add_library(foo SHARED foo.cpp)

# 配置Framework相关属性
set_target_properties(foo PROPERTIES
    # 告诉CMake生成标准Framework结构
    FRAMEWORK TRUE
    # Framework版本号(可选,按需设置)
    FRAMEWORK_VERSION A
    # Framework的唯一标识符(建议设为公司域名+库名,比如com.yourcompany.foo)
    MACOSX_FRAMEWORK_IDENTIFIER com.yourcompany.foo
    # 关键:设置install name为@rpath
    INSTALL_NAME_DIR "@rpath"
)

重新构建后,再用otool -D检查,install name就会变成@rpath/foo.framework/foo了。

方法2:手动修改已构建的Framework

如果已经构建好了不想重新跑CMake,可以用install_name_tool手动修改:

install_name_tool -id "@rpath/foo.framework/foo" /path/to/your/foo.framework/foo

最后检查Xcode配置

确保你的Xcode项目里这两个地方没问题:

  • 把Framework添加到Frameworks, Libraries, and Embedded Content中,并且Embedded选项设为Embed & Sign。
  • 检查Build Settings里的Runpath Search Paths,确保包含@executable_path/Frameworks(iOS项目默认会有,不过最好确认一下)。

这样处理后,app就能在设备上正确加载嵌入的Framework了!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 09:07:49