我已经阅读了有关如何让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 (没有这样的文件或目录)
然而,当我
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"
答案 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将其作为其他项目的依赖项进行管理,而不需要花费太多精力。