3

XCode でユニバーサル ライブラリを作成する方法について、いくつかのチュートリアルとガイドを読みました。基本的には、bash スクリプト ビルド フェーズで集約ターゲットを追加して、個別のターゲットをビルドし、それらをまとめて lipo します。

私は自分の小さなスクリプトを持っています (ターゲットに名前を付けた方法で動作します) が、何らかの理由で 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 (そのようなファイルやディレクトリはありません)

しかし、私が

  1. 失敗したビルドの直後にまったく同じ lipo コマンドを実行すると、すべてが機能し、ファイルが見つかります。
  2. スクリプトに bash ロジックを追加して、問題が解決しないファイルの作成を待ちます。
  3. 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"
4

2 に答える 2

0

これは 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 ..."
  • の代わりにlipowithにすべての要素を個別に渡します。"${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-13T22:29:19.287 に答える
-1

技術的には、これはあなたの質問に対する答えではありません。ただし、本当に必要でない限り、現在行っていることとは別のオプションを選択することをお勧めします。

この方法でユニバーサル静的ライブラリを構築することは、物事を行うための非常に古い方法であり、お気づきのように、うまく機能させるには複雑で非常に問題があります。

より最新ではるかに単純なアプローチ (IMHO) は、フレームワークを構築することです。XCode には、フレームワーク用のテンプレートがあります。フレームワークは操作が簡単で、複数のターゲット、bash、lipo をいじる必要はありません。

さらに、Carthageを使用して、それらを他のプロジェクトの依存関係として管理することも、ほとんど手間をかけずに行うことができます。

于 2016-10-14T02:27:17.517 に答える