Xcode通用库构建阶段- Lipo无法找到文件

dced5bon  于 2023-03-04  发布在  其他
关注(0)|答案(2)|浏览(230)

我读过一些关于如何让Xcode创建一个通用库的教程和指南,基本上是通过bash脚本构建阶段添加一个聚合目标来构建单独的目标,然后将它们组合在一起。
我有自己的小脚本(因为我给我的目标命名,所以它可以工作),但是由于某些原因,lipo找不到这些文件;
致命错误:/应用程序/www.example.com无法打开输入文件: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)
然而当我
1.在构建失败后立即运行完全相同的lipo命令,一切正常,文件也找到了。
1.在我的脚本中添加bash逻辑,等待文件创建后问题仍然存在。
1.将脚本中的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"
polhcujo

polhcujo1#

这是个大问题/错误。
你把所有的文件名作为一个参数传递给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";
qf9go6mv

qf9go6mv2#

从技术上讲,这不是你问题的答案,但我想建议你选择一个不同的选项,你正在做的,除非你真的需要这样做。
以这种方式构建通用静态库是一种非常古老的方法,而且正如您所发现的,要使其正常工作非常复杂和困难。
一个更流行、更简单的方法(恕我直言)是构建一个框架。XCode有框架模板。框架更容易使用,不需要你像现在这样对多个目标、bash和lipo做任何乱七八糟的事情。
此外,您可以使用Carthage将它们作为其他项目的依赖项进行管理,而不需要太多的工作。

相关问题