我阅读了一些关于如何让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"发布于 2016-10-13 22:29:19
这是一个严重的问题/错误。
您要将所有文件名作为单个参数传递给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"分别将每个元素传递给"$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-14 02:27:17
从技术上讲,这不是你问题的答案。但我想建议你选择一个与你正在做的不同的选择,除非你真的需要这样做。
以这种方式构建通用静态库是一种非常古老的方法,正如您所发现的那样,要获得良好的工作就很复杂,也很成问题。
一个更当前和更简单的方法(IMHO)是建立一个框架。XCode有用于框架的模板。框架更容易使用,并且不要求您对多个目标、bash和lipo做任何混乱的操作。
此外,您可以使用迦太基作为其他项目的依赖项来管理它们,只需花费很少的努力。
https://stackoverflow.com/questions/40018097
复制相似问题