XCode 通用库构建阶段 - Lipo 找不到文件
XCode universal library build phase - Lipo can't find files
我已经阅读了一些关于如何 XCode 创建通用库的教程和指南。基本上,您添加一个带有 bash 脚本构建阶段的聚合目标来构建单独的目标并将它们组合在一起。
我有自己的小脚本(由于我命名目标的方式而起作用)但出于某种原因 lipo 找不到文件;
fatal error:
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/lipo:
can't open input file:
/Users/username/Projects/project/plugins/build/Release-iphoneos/libproject-plugins.a
/Users/username/Projects/project/plugins/build/Release-macos/libproject-plugins.a
(No such file or directory)
然而当我
- 运行 在构建失败后立即执行完全相同的 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 problem/mistake。
您将所有文件名作为单个参数传递给 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";
从技术上讲,这不是您问题的答案。但我想建议您选择与您正在做的事情不同的选项,除非您真的需要去做。
以这种方式构建通用静态库是一种非常古老的做事方式,而且正如您所发现的那样,要想正常工作很复杂而且问题很大。
一种更现代、更简单的方法 (恕我直言) 是构建一个框架。 XCode 有框架模板。框架更易于使用,并且不需要您像现在这样处理多个目标,bash 和 lipo。
此外,您可以使用 Carthage 来管理它们作为其他项目的依赖项,而无需付出太多努力。
我已经阅读了一些关于如何 XCode 创建通用库的教程和指南。基本上,您添加一个带有 bash 脚本构建阶段的聚合目标来构建单独的目标并将它们组合在一起。
我有自己的小脚本(由于我命名目标的方式而起作用)但出于某种原因 lipo 找不到文件;
fatal error: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/lipo: can't open input file: /Users/username/Projects/project/plugins/build/Release-iphoneos/libproject-plugins.a /Users/username/Projects/project/plugins/build/Release-macos/libproject-plugins.a (No such file or directory)
然而当我
- 运行 在构建失败后立即执行完全相同的 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 problem/mistake。
您将所有文件名作为单个参数传递给 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";
从技术上讲,这不是您问题的答案。但我想建议您选择与您正在做的事情不同的选项,除非您真的需要去做。
以这种方式构建通用静态库是一种非常古老的做事方式,而且正如您所发现的那样,要想正常工作很复杂而且问题很大。
一种更现代、更简单的方法 (恕我直言) 是构建一个框架。 XCode 有框架模板。框架更易于使用,并且不需要您像现在这样处理多个目标,bash 和 lipo。
此外,您可以使用 Carthage 来管理它们作为其他项目的依赖项,而无需付出太多努力。