XCode通用库构建阶段--Lipo找不到文件

时间:2016-10-13 10:09:23

标签: xcode bash mach-o universal-binary lipo

我已经阅读了有关如何让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,文件就在那里。
  4. 所以我不确定出了什么问题,看起来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"
    

2 个答案:

答案 0 :(得分:0)

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

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

  • 使用()代替""进行初始化。
  • 使用+=(...)而不是="$var ..."添加元素。
  • 使用lipo而不是"${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";

答案 1 :(得分:0)

从技术上讲,这不是你问题的答案。但我建议你选择一个不同的选项,除非你真的需要这样做。

以这种方式构建通用静态库是一种非常古老的处理方式,正如您所发现的那样,复杂且难以正常工作。

更现实,更简单的方法(恕我直言)是建立一个框架。 XCode具有框架模板。框架更易于使用,并且不需要您像现在这样使用多个目标,bash和lipo进行任何混乱。

此外,您可以使用Carthage将其作为其他项目的依赖项进行管理,而不需要花费太多精力。