【发布时间】:2015-05-29 15:25:11
【问题描述】:
我有一个以 iOS 6.0 作为部署目标的 iOS 项目。它在 Xcode 和 xcodebuilder 下都可以很好地构建(对于 CI 来说是必需的)。然而,客户现在希望该项目仅适用于安装了 iOS7+ 的用户。
没问题,我只是增加部署目标数对吗?错了!
在 Xcode 下,项目继续编译得很好。然而,在 xcodebuild 下,项目编译失败,出现很多这样的错误:
架构 armv7 的未定义符号:
“std::string::_Rep::_S_empty_rep_storage”,引用自: 在drmNativeInterface中
它使用Adobe Primetime,drmNativeInterface 是其中的一部分。
为了帮助隔离问题,我创建了一个全新的单屏项目并进行了以下更改:
添加了
drmNativeInterface框架和两个 Apple 提供的在 Xcode 中构建项目所需的依赖项,MediaPlayer和AVFoundation到"Link Binary with Libraries"。 Primetime 文档也列出了其他依赖项,但如果我添加这些依赖项并没有什么区别 - 这些是在 Xcode 下成功构建所需的唯一两个。用
"armv6 armv7 armv7s"替换了有效的拱门"arm64 armv7 armv7s"(即使 drmNativeInterface 显然包含 i386、x86_64、armv7s 和 arm64 切片,即使 Xcode 也不会编译项目,除非我将 arm64 切换为 armv6)。将两种配置的
"Build Active Architecture Only"设置为 NO。最后,将
"-lstdc++ -ObjC -all_load"添加到"Other Linker Flags"。
除了上面那几个步骤之外,该项目是库存单屏:没有添加任何代码。
Xcode 会编译它,但 xcodebuild 不会。为了让 xcodebuild 编译它,我必须将部署目标切换到 6.0,这会破坏客户端的请求。
CI xcodebuild 命令包含一些参数,但这是我用于此测试项目的最小化命令:
xcodebuild -project
"MyProject.xcodeproj"-scheme"MyProject"
我尝试添加 FRAMEWORK_SEARCH_PATHS、HEADER_SEARCH_PATHS 和 ALWAYS_SEARCH_USER_PATHS 参数,以防 xcodebuild 根本无法使用项目文件中包含的路径,但这没有任何区别。
如果我从项目中删除 drmNativeInterface 框架 - 只留下 2 个基于 Apple 的依赖项 - 该项目对于 Xcode 和 xcodebuild 都可以正常编译。但显然这不是一个解决方案,因为我需要那个框架!
有谁知道是什么原因造成的或如何解决?
**注:**
有很多关于 SO 项目将在 Xcode 中构建而不在 xcodebuilder 中构建的问题,但我找不到任何项目将在 xcodebuilder 中构建的地方适合一个部署目标而不适合另一个部署目标。
提前致谢。
【问题讨论】:
-
我之前在我的机器上安装了多个版本的 Xcode 时遇到过问题。您是否使用
xcode-select设置了命令行调用使用的正确版本? -
我在我的机器上全新安装了 Yosemite,Xcode 6.3.2 是唯一安装的版本。该问题也在 CI 服务器上重现。
标签: ios xcode xcodebuild