【问题标题】:iOS Framework: image not foundiOS 框架:找不到图像
【发布时间】:2018-02-19 22:22:40
【问题描述】:

尝试将共享框架 generated from CMake 嵌入 Xcode iOS 应用程序时,遇到以下问题:

dyld:库未加载:/Users/jones/Documents/project/build/ios/foo.framework/foo

引用自:/var/Containers/Bundle/Application//myapp.app/myapp

原因:图片未找到

它似乎有一个不正确的“dylib id”,但我不确定这究竟意味着什么。请注意,我的框架出现在应用程序的“框架”文件夹中(手机上安装的内置“产品”)。

otool -L检查我的应用,我明白了:

myapp:
    /Users/name/Documents/project/build/ios/foo.framework/foo
    /System/Library/Frameworks/Foundation.framework/Foundation
    /usr/lib/libobjc.A.dylib
    ...

这似乎表明我的框架的路径在应用程序中是错误的。但我似乎无法从 Xcode 更改它。

Apple dev forum 上,有人提到将 DYLIB_INSTALL_NAME_BASE 从 Build Settings -> Dynamic Library Install Name Base 更改为 @rpath,但这并没有解决我的问题。

来自 Xcode 的链接器日志看起来像这样(也许更容易阅读here:

Ld /Users/jones/Library/Developer/Xcode/DerivedData/myapp-gngqigiisiapqjflqkjjadvdbneu/Build/Products/Debug-iphoneos/myapp.app/myapp normal arm64
cd /Users/jones/Documents/project/ios-playground/myapp
export IPHONEOS_DEPLOYMENT_TARGET=11.2
export PATH="/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/usr/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin"
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang++ -arch arm64 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS11.2.sdk -L/Users/jones/Library/Developer/Xcode/DerivedData/myapp-gngqigiisiapqjflqkjjadvdbneu/Build/Products/Debug-iphoneos -F/Users/jones/Library/Developer/Xcode/DerivedData/myapp-gngqigiisiapqjflqkjjadvdbneu/Build/Products/Debug-iphoneos -F/Users/jones/Documents/project/ios-playground/myapp -F/Users/jones/Documents/project/ios-playground/myapp/Frameworks -filelist /Users/jones/Library/Developer/Xcode/DerivedData/myapp-gngqigiisiapqjflqkjjadvdbneu/Build/Intermediates.noindex/myapp.build/Debug-iphoneos/myapp.build/Objects-normal/arm64/myapp.LinkFileList -Xlinker -rpath -Xlinker @executable_path/Frameworks -miphoneos-version-min=11.2 -dead_strip -Xlinker -object_path_lto -Xlinker /Users/jones/Library/Developer/Xcode/DerivedData/myapp-gngqigiisiapqjflqkjjadvdbneu/Build/Intermediates.noindex/myapp.build/Debug-iphoneos/myapp.build/Objects-normal/arm64/myapp_lto.o -Xlinker -export_dynamic -Xlinker -no_deduplicate -fembed-bitcode-marker -stdlib=libc++ -fobjc-link-runtime -L/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/iphoneos -Xlinker -add_ast_path -Xlinker /Users/jones/Library/Developer/Xcode/DerivedData/myapp-gngqigiisiapqjflqkjjadvdbneu/Build/Intermediates.noindex/myapp.build/Debug-iphoneos/myapp.build/Objects-normal/arm64/myapp.swiftmodule -framework foo -Xlinker -dependency_info -Xlinker /Users/jones/Library/Developer/Xcode/DerivedData/myapp-gngqigiisiapqjflqkjjadvdbneu/Build/Intermediates.noindex/myapp.build/Debug-iphoneos/myapp.build/Objects-normal/arm64/myapp_dependency_info.dat -o /Users/jones/Library/Developer/Xcode/DerivedData/myapp-gngqigiisiapqjflqkjjadvdbneu/Build/Products/Debug-iphoneos/myapp.app/myapp

我该如何解决这个问题?

【问题讨论】:

  • 您是否已将您的框架添加到 Xcode 中的 Embedded Binaries 中?
  • 是的,但它说“foo.framework ...in ../../project/build/ios”,所以我怀疑这个路径是设置的@rpath/foo.framework/foo.
  • 框架应该在Project Navigator中找到。如果已读取,则应选择它并将 Xcode 引用更改为 File Inspector 中的正确位置。
  • 我不确定你的意思。框架显示在 Project Navigator 中。 文件检查器中的“完整路径”是正确的。有趣的是,对于otool -L myapp,我看不到“完整路径”(即参考)的链接,而是我系统上框架的链接(应该是@rpath/foo.framework/foo)。
  • 您能否将应用的​​链接器输出添加到您的帖子中?

标签: c++ ios cmake


【解决方案1】:

其实有一种方法可以在 CMake 中设置“install_name_dir”:

set_target_properties(dynamicFramework PROPERTIES
    ...
    BUILD_WITH_INSTALL_RPATH TRUE
    INSTALL_NAME_DIR @rpath
)

【讨论】:

  • 不应该 MACOS_RPATH 属性将 install_name 设置为 @rpath 而不必手动设置 INSTALL_NAME_DIR 吗?另外,我相信BUILD_WITH_INSTALL_RPATH 只需要在构建树中也有@rpath,但如果使用安装树中的框架/dylib 则不是必需的。
猜你喜欢
  • 1970-01-01
  • 2023-03-05
  • 2016-08-27
  • 1970-01-01
  • 1970-01-01
  • 2020-09-22
  • 2013-10-08
  • 2016-03-30
  • 2022-07-12
相关资源
最近更新 更多