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

XCode通用库构建阶段-Lipo can';找不到文件,xcode,bash,mach-o,universal-binary,lipo,Xcode,Bash,Mach O,Universal Binary,Lipo,我已经阅读了一些关于如何让XCode创建通用库的教程和指南。基本上,您可以在bash脚本构建阶段添加一个聚合目标,以构建单独的目标并将它们组合在一起 我有自己的小脚本(这是因为我如何命名我的目标),但由于某些原因lipo找不到文件 致命错误: /Applications/Xcode.app/Contents/Developer/toolschains/xcodefault.xctoolschain/usr/bin/lipo: 无法打开输入文件: /Users/username/Projects/

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

我有自己的小脚本(这是因为我如何命名我的目标),但由于某些原因lipo找不到文件

致命错误: /Applications/Xcode.app/Contents/Developer/toolschains/xcodefault.xctoolschain/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 (无此类文件或目录)

但是当我

  • 在失败的构建之后立即运行完全相同的lipo命令,一切正常,文件被找到
  • 在我的脚本中添加bash逻辑,等待文件创建,直到问题仍然存在
  • 用一个简单的
    ls
    替换我脚本中的
    lipo
    ,文件就在那里
  • 所以我不确定哪里出了问题,它似乎不像
    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"
    

    这是一个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…”
    • 使用
      “${var[@]}”而不是
      “$var”
      将每个元素分别传递给
      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+=("${PROJECT_DIR}/build/${CONFIGURATION}-$target/libproject-plugins.a");
    done;
    
    xcrun lipo -create "${target_results[@]}" -o "${PROJECT_DIR}/plugins-universal.a";
    

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

    以这种方式构建通用静态库是一种非常古老的方法,正如您所发现的那样,要使其正常工作非常复杂而且非常困难

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

    此外,您还可以将它们作为其他项目的依赖项进行管理,而只需花费很少的精力