gpt4 book ai didi

Xcode Workspace 中的 iOS 框架测试失败

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:01:19 24 4
gpt4 key购买 nike

我有一个 Xcode 工作区,其中包含 2 个 Swift 项目,OAuth 和 Commons。
每个项目都有一个 iOS 框架目标和一个测试目标。他们互不依赖。
Commons 项目没有依赖关系,而 OAuth 框架目标导入 WebKit(import WebKit).

现在,如果我在 Xcode 中运行测试,OAuth 测试工作正常,但 Commons 测试失败并显示以下 Xcode 错误日志:

Test target CommonsTests encountered an error (Early unexpected exit, operation never finished bootstrapping - no restart will be attempted)

如果我使用以下命令从命令行运行测试

xcodebuild -workspace Workspace.xcworkspace -configuration Debug -destination "platform=iOS Simulator,name=iPhone 6" -scheme OAuth test

xcodebuild -workspace Workspace.xcworkspace -configuration Debug -destination "platform=iOS Simulator,name=iPhone 6" -scheme Commons test

我在第二个命令后收到以下错误:

The bundle “CommonsTests” couldn’t be loaded because it is damaged or missing necessary resources. Try reinstalling the bundle.
(dlopen_preflight(~/Library/Developer/Xcode/DerivedData/Workspace-aslcnsaomwggxqcxoozzfuztgszf/Build/Products/Debug-iphonesimulator/CommonsTests.xctest/CommonsTests): Library not loaded: @rpath/libswiftWebKit.dylib
Referenced from: ~/Library/Developer/Xcode/DerivedData/Workspace-aslcnsaomwggxqcxoozzfuztgszf/Build/Products/Debug-iphonesimulator/OAuth.framework/OAuth Reason: image not found)

我的设置可能有什么问题?其他人也会出现此问题吗?


解决方法:

1) 如果我还在 CommonsTests bundle 中包含 WebKit,则一切正常。但是由于 OAuth 和 Commons 框架之间没有依赖关系,我看不出有任何必要这样做的理由。

2) 如果我将 OAuth 项目(和目标)重命名为 OAuth2 之类的名称,一切正常。这真的很奇怪。可能是名称冲突或缓存问题。

重命名解决方法是否解决了其他人的问题?


示例项目:https://www.dropbox.com/s/dn3ywhxlc9kb6y4/SampleProject.zip?dl=0

设置:
Xcode 7.3(Xcode 7.2也有错误)
OS X 10.11.4(OS X 10.11.3 也会报错)

最佳答案

再次查看问题后,我可以找到奇怪行为的原因。

简答:
有一个私有(private)的 OAuth Apple 框架位于 /System/Library/PrivateFrameworks/OAuth.framework/OAuth 这导致与我自己的 OAuth 框架的名称冲突,因为 xctest 似乎链接这个框架。

长答案:
xctestXCTest.framework 似乎从 Private Frameworks 文件夹加载 OAuth.framework。

如果在 Xcode 中使用工作区,测试环境将使用以下 dyld 环境变量:

"DYLD_FRAMEWORK_PATH“= "/Users/{USER}/Library/Developer/Xcode/DerivedData/{PROJECT}/Build/Products/Debug-iphonesimulator:/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/Library/Frameworks“;

该变量具有以下作用:

DYLD_FRAMEWORK_PATH
This is a colon separated list of directories that contain frameworks. The dynamic linker
searches these directories before it searches for the framework by its install name. It
allows you to test new versions of existing frameworks. (A framework is a library install name
that ends in the form XXX.framework/Versions/YYY/XXX or XXX.framework/XXX, where XXX and YYY
are any name.)

For each framework that a program uses, the dynamic linker looks for the framework in each
directory in DYLD_FRAMEWORK_PATH in turn. If it looks in all the directories and can't find
the framework, it searches the directories in DYLD_LIBRARY_PATH in turn. If it still can't
find the framework, it then searches DYLD_FALLBACK_FRAMEWORK_PATH and DYLD_FALL-BACK_LIBRARY_PATH DYLD_FALLBACK_LIBRARY_PATH
BACK_LIBRARY_PATH in turn.

DYLD_FRAMEWORK_PATH 定义框架的搜索目录并覆盖默认搜索路径和安装名称,它们嵌入到相关二进制文件中。即使二进制文件指定了框架安装路径,如/System/Library/Frameworks/OAuth环境变量导致目录的行为/Users/{USER}/Library/Developer/Xcode/DerivedData/{PROJECT}/Build/Products/Debug-iphonesimulator搜索 OAuth.framework/OAuth 二进制文件,而不考虑实际安装名称。

此行为是有意为之的,因为它允许使用较新版本覆盖现有二进制文件中的框架,而无需重新编译二进制文件。

但是,如果两个框架具有相同的名称,它也可能导致二进制文件的误导性链接。然后,即使另一个框架由路径指定,也可以加载具有相同名称的框架之一。如果第一个目录包含在 DYLD_FRAMEWORK_PATH 中,要么先于另一个目录,要么根本不存在,那么将根据其名称选择第一个,而不考虑指定的安装名称路径。

具体示例:

xctest二进制加载命令:/System/Library/PrivateFrameworks/OAuth.framework/OAuth(兼容版本300.0.0,当前版本1280.24.0)

OAuth 存在于以下路径中:
/System/Library/PrivateFrameworks/OAuth.framework/OAuth/Users/{USER}/Library/Developer/Xcode/DerivedData/{PROJECT}/Build/Products/Debug-iphonesimulator/OAuth.framework/OAuth

xctest 使用以下环境变量启动:
"DYLD_FRAMEWORK_PATH“= "/Users/{USER}/Library/Developer/Xcode/DerivedData/{PROJECT}/Build/Products/Debug-iphonesimulator:/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator。平台/开发人员/库/框架“;

然后是OAuth框架
/Users/{USER}/Library/Developer/Xcode/DerivedData/{PROJECT}/Build/Products/Debug-iphonesimulator/OAuth.framework/OAuth
即使安装名称是
也被使用/System/Library/PrivateFrameworks/OAuth.framework/OAuth

关于Xcode Workspace 中的 iOS 框架测试失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36468015/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com