3

我已经阅读了一些关于如何让 XCode 创建通用库的教程和指南。基本上,您添加一个带有 bash 脚本构建阶段的聚合目标来构建单独的目标并将它们组合在一起。

我有自己的小脚本(由于我如何命名目标而起作用),但由于某种原因 lipo 找不到文件;

致命错误:/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/lipo:无法打开输入文件:/Users/username/Projects/project/plugins/build/Release-iphoneos/ libproject-plugins.a /Users/username/Projects/project/plugins/build/Release-macos/libproject-plugins.a (没有这样的文件或目录)

然而当我

  1. 在构建失败后立即运行完全相同的 lipo 命令,一切正常并找到文件。
  2. 在我的脚本中添加 bash 逻辑以等待文件创建问题仍然存在。
  3. 用一个简单的替换lipo我的脚本中ls的文件,文件就在那里。

所以我不确定出了什么问题,它似乎不像xcodebuild只在调用 lipo 之后创建文件(正如我首先想到的那样)。

剧本;

targets=$(xcodebuild -list | sed -n '/Targets/,/^$/p' | grep -v -e 'Targets:\|all\|^$')
target_results=""

for target in $targets; do
    xcodebuild ${ACTION} -target $target -configuration ${CONFIGURATION}
    target_results="$target_results ${PROJECT_DIR}/build/${CONFIGURATION}-$target/libproject-plugins.a"
done

xcrun lipo -create "$target_results" -o "${PROJECT_DIR}/plugins-universal.a"
4

2 回答 2

0

这是一个 bash 问题/错误。
您将所有文件名作为单个参数传递给lipo,因此它将寻找一个名为/Users/username/Projects/project/plugins/build/Release-iphoneos/libproject-plugins.a /Users/username/Projects/project/plugins/build/Release-macos/libproject-plugins.a.

您应该改用数组作为文件名。

  • ()用而不是初始化它""
  • +=(...)使用而不是添加元素="$var ..."
  • 将每个元素分别传递给lipowith"${var[@]}"而不是"$var".

应用于您的脚本:

targets=$(xcodebuild -list | sed -n '/Targets/,/^$/p' | grep -v -e 'Targets:\|all\|^$');
target_results=();

for target in $targets; do
    xcodebuild ${ACTION} -target $target -configuration ${CONFIGURATION};
    target_results+=("${PROJECT_DIR}/build/${CONFIGURATION}-$target/libproject-plugins.a");
done;

xcrun lipo -create "${target_results[@]}" -o "${PROJECT_DIR}/plugins-universal.a";
于 2016-10-13T22:29:19.287 回答
-1

从技术上讲,这不是您问题的答案。但我想建议您选择与您正在做的事情不同的选项,除非您真的要这样做。

以这种方式构建通用静态库是一种非常古老的做事方式,并且正如您所发现的那样,要使其正常工作很复杂且很成问题。

一种更流行、更简单的方法(恕我直言)是构建一个框架。XCode 有框架模板。框架更易于使用,并且不需要您像您一样对多个目标、bash 和 lipo 进行任何处理。

此外,您可以使用Carthage将它们作为其他项目的依赖项进行管理,而无需付出任何努力。

于 2016-10-14T02:27:17.517 回答