別のプロジェクト(これもワークスペースにある)の静的ライブラリとリンクするプロジェクトを含むワークスペースがあります。 Kobold2D の問題です原因はわかりましたが、解決できませんでした。 この質問と同様 だと思います。
プロジェクトターゲットと静的ライブラリターゲットはすべて、DebugおよびReleaseビルド構成を持っています。すべては順調です。
ここで、誰かがプロジェクトに新しいビルド構成を追加し、たとえばAd-Hocという名前を付けます。これで、プロジェクトのターゲットはAd-Hoc構成を構築しますが、静的ライブラリにはそのような構成はありません。どうやら彼らはデフォルトでRelease構成を構築しているようです。
最後に、リンカーがすべてをまとめるはずの場合、失敗します。
_ld: library not found for -lbox2d-ios
Command /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/clang++ failed with exit code 1
_
-force_load $(BUILT_PRODUCTS_DIR)/libSomeLib.a
を介して強制的にロードされたライブラリの場合、エラーは同様ですが、「ファイルが見つかりません」と表示されます。ライブラリ「libbox2d-ios.a」が「ライブラリとバイナリをリンク」ビルドフェーズリストにあることに注意してください。
明らかに問題は、リンカーがライブラリがBUILT_PRODUCTS_DIRのAd-Hoc-iphoneosフォルダーにあると想定している一方で、それらが実際にRelease-iphoneosフォルダーにあるためです。 Ad-Hocビルド構成がありません。
どうすればリンカの顔を平手打ちして、ライブラリを入手するように彼に言うことができますか?できれば、両方の場合に機能するソリューションを探しています。つまり、ライブラリが標準的な方法で追加され(バイナリをライブラリ構築フェーズにリンク)、ライブラリが機能するために追加の-force_loadが必要です。
私はいくつかの方法があることを望んでいます:
すみませんが、私はこれを言わなければなりません…ARGH! :)
残念ながら、これを行う方法は見つかりませんでした。私が見つけることができる最良の回避策は、新しいビルド構成ではなく新しいターゲットを追加することです。たとえば、私のプロジェクトの1つでは、リリースとデバッグの構成しかありませんが、「MyProject-アプリストア」および「MyProject-アドホック」と呼ばれる追加のターゲットがあります。もちろん、これはプロジェクトファイルを制御できる場合にのみ可能です。
複製されたターゲットが座っていると、極端に迷惑になります。1つのターゲットにファイルを追加し、他のターゲットに追加するのを忘れることがあり、ビルドしてみるまでわからないからです。しかし、それはビルドを行います。これは勝利です(とにかくxcodeを使用)。
少し前に私が尋ねた同様の質問: xcode 4でアーカイブを作成するための静的ライブラリを使用してiOSプロジェクトでビルド構成を設定する正しい方法は何ですか?
同様の質問で述べたように カスタムビルド構成を持つプロジェクトのサブプロジェクトとしてのiOS静的ライブラリ? 、修正はこの行を追加することです
$(BUILD_DIR)/Release$(EFFECTIVE_PLATFORM_NAME)
ターゲットのFramework Search Paths
、Header Search Paths
および/またはLibrary Search Paths
ここに私のために働く何かがあります。
アドホックビルド構成のプロジェクトで、アドホックビルド構成の「構成ごとのビルド製品パス」(CONFIGURATION_BUILD_DIR)と「構成ごとの中間ビルドファイルパス」(CONFIGURATION_TEMP_DIR)をオーバーライドして、リリース構成と同じフォルダーを使用します。
Adhoc: CONFIGURATION_BUILD_DIR = $(SYMROOT)/Release$(EFFECTIVE_PLATFORM_NAME)
Adhoc: CONFIGURATION_TEMP_DIR = $(PROJECT_TEMP_DIR)/Release$(EFFECTIVE_PLATFORM_NAME)
これで、アドホックビルドを実行すると、XcodeはlibFoo.aとBar.appをRelease-iphoneosフォルダーに配置します。リンカは問題なく動作し、通常どおり-force_load $(BUILT_PRODUCTS_DIR)/libFoo.aを使用できます。
または、Release-iphoneosフォルダーをアドホックビルド構成のライブラリ検索パスに追加することもできます。
Adhoc: LIBRARY_SEARCH_PATHS = $(inherited) $(BUILD_DIR)/Release$(EFFECTIVE_PLATFORM_NAME)
ただし、ビルド構成ごとに異なる-force_loadを設定する必要があります。
Debug: OTHER_LINKER_FLAGS = $(inherited) -force_load $(BUILT_PRODUCTS_DIR)/libFoo.a
Adhoc: OTHER_LINKER_FLAGS = $(inherited) -force_load $(BUILD_DIR)/Release$(EFFECTIVE_PLATFORM_NAME)
Release: OTHER_LINKER_FLAGS = $(inherited) -force_load $(BUILT_PRODUCTS_DIR)/libFoo.a
CocoaPodsを使用していて、複数のアドホック(またはエンタープライズ、ベータ)構成を作成しようとする同様の問題があります。
これが機能しているように見えるものです(両方のプロジェクトが同じxcworkspaceにあるとしましょう):
subproject
で生成されたlibをmainproject
Link Binary with Librariesに追加します。
構成Adhoc
はsubproject
によって認識されないため、Xcodeはビルド時にフォールバック(またはリストの最初の構成)としてRelease
構成を使用します。
リンカはライブラリが見つからないので文句を言います…わかりました、これを処理しましょう。
ターゲットの依存関係フェーズの直後のmainproject
に、スクリプトの実行ビルドフェーズを追加します。次のスクリプトを入力します。
if [ "$CONFIGURATION" = "Adhoc" ]; then
echo "====================================="
echo "Copying libPods Release into the Adhoc product build dir!"
echo "====================================="
cp "$BUILT_PRODUCTS_DIR/../Release-$PLATFORM_NAME/libPods.a" "$BUILT_PRODUCTS_DIR"
else
echo "No manual lib copy."
fi
これにより、subproject
Release
ビルド(mainproject
がビルドされたときに発生します)によって生成されたlibがAdhoc
ビルドディレクトリにコピーされ、リンカーがlibを検出します。そして、私たちは行ってもいいはずです!うん!
私のフレームワークは、アプリプロジェクト内の別のSDKプロジェクトを使用して構築されています。最初に「デバッグ」と「リリース」を用意し、次に新しい"TestFlight"構成を追加します。新しいものではアーカイブできません。最終的にSDKプロジェクトに同じ名前の新しいビルド構成を追加する。つまり、アプリとSDKプロジェクトの両方に "TestFlight"構成を追加することになりました。これでアーカイブが機能します。
それが最善の方法かどうかはわかりません。しかし、今のところ私には十分きれいに見えます。 :)
ああ、そしてCocoapodsの場合、構成を複製した後、すぐにpod install
を実行すると、次の黄色の警告が表示されます。
[!]プロジェクトにはすでにカスタム構成が設定されているため、CocoaPodsはプロジェクトの基本構成を設定しませんでした。 CocoaPods統合を完全に機能させるには、ターゲットの基本構成を設定してください...
プロジェクトの「情報」タブの「構成」セクションに移動し、作成した新しい構成を選択して、すべてのターゲットの「Pods.release」を最初に"None"に設定する必要があります。その後、pod install
を安全に実行できます。
通常、AppStore
スキームがあります(AppStore
構成にマップされます)。
私に起こった1つのことは、CocoapodがPods.build
の代わりにRelease-iphonesimulator
内のAppStore-iphonesimulator
のビルドフォルダーを生成するという、大文字と小文字を区別する問題でした。
スキームと設定をリンクしたときにクリックを間違えたと思いますが、それを削除して再度追加するだけで、何が悪かったのかがわかりました。差分を確認してください。
私はcocoapods0.38.2を使用していたので、これは明らかにユーザーの設定ミスであり、 Cocoapodsの問題は解決されていません) on0.34
Xcodebuildを実行する前に、CONFIGURATION_BUILD_DIR =/Some/Shared/Dirを追加できます。例えば:
cd SOURCE_DIR
xcodebuild -workspace YourProject.xcworkspace -scheme YourScheme -configuration AdHoc -sdk iphoneos clean build CONFIGURATION_BUILD_DIR="`pwd`"/build
Library
またはFramework
のプリコンパイル時エラーです
Xcodeがパブリックヘッダーの場所を見つけることができないため、この問題が発生しています。正しいパスを追加して、Xcodeにそれらの場所を伝えるだけです。
次の場合にModule not found
を取得できます。
Build Settings -> Header Search Paths
へのライブラリパスが含まれていませんBuild Settings -> Framework Search Paths
へのフレームワークパスを含めていません