web-dev-qa-db-ja.com

Xcodeカスタムビルド構成により、静的ライブラリの「ライブラリ/ファイルが見つかりません」

別のプロジェクト(これもワークスペースにある)の静的ライブラリとリンクするプロジェクトを含むワークスペースがあります。 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が必要です。

私はいくつかの方法があることを望んでいます:

  • ライブラリをアプリのターゲットのビルド構成フォルダーに強制的に配置する
  • 各ライブラリをビルド構成フォルダーにコピーするコンパイル後およびリンク前のスクリプトを実行します
  • ライブラリへの相対パスを指定する
  • -force_loadに$ BUILT_PRODUCTS_DIR以外の別のマクロを使用します
  • -WTFmake-all-problems-go-awayのようなリンカーフラグ

すみませんが、私はこれを言わなければなりません…ARGH! :)

43
LearnCocos2D

残念ながら、これを行う方法は見つかりませんでした。私が見つけることができる最良の回避策は、新しいビルド構成ではなく新しいターゲットを追加することです。たとえば、私のプロジェクトの1つでは、リリースとデバッグの構成しかありませんが、「MyProject-アプリストア」および「MyProject-アドホック」と呼ばれる追加のターゲットがあります。もちろん、これはプロジェクトファイルを制御できる場合にのみ可能です。

複製されたターゲットが座っていると、極端に迷惑になります。1つのターゲットにファイルを追加し、他のターゲットに追加するのを忘れることがあり、ビルドしてみるまでわからないからです。しかし、それはビルドを行います。これは勝利です(とにかくxcodeを使用)。

少し前に私が尋ねた同様の質問: xcode 4でアーカイブを作成するための静的ライブラリを使用してiOSプロジェクトでビルド構成を設定する正しい方法は何ですか?

6
Daniel

同様の質問で述べたように カスタムビルド構成を持つプロジェクトのサブプロジェクトとしてのiOS静的ライブラリ? 、修正はこの行を追加することです

$(BUILD_DIR)/Release$(EFFECTIVE_PLATFORM_NAME)

ターゲットのFramework Search PathsHeader Search Pathsおよび/またはLibrary Search Paths

31
ULazdins

ここに私のために働く何かがあります。

アドホックビルド構成のプロジェクトで、アドホックビルド構成の「構成ごとのビルド製品パス」(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
20
lukelutman

CocoaPodsを使用していて、複数のアドホック(またはエンタープライズ、ベータ)構成を作成しようとする同様の問題があります。

これが機能しているように見えるものです(両方のプロジェクトが同じxcworkspaceにあるとしましょう):

  • subprojectで生成されたlibをmainproject Link Binary with Librariesに追加します。

  • 構成Adhocsubprojectによって認識されないため、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

これにより、subprojectReleaseビルド(mainprojectがビルドされたときに発生します)によって生成されたlibがAdhocビルドディレクトリにコピーされ、リンカーがlibを検出します。そして、私たちは行ってもいいはずです!うん!

7
MonsieurDart

私のフレームワークは、アプリプロジェクト内の別のSDKプロジェクトを使用して構築されています。最初に「デバッグ」と「リリース」を用意し、次に新しい"TestFlight"構成を追加します。新しいものではアーカイブできません。最終的にSDKプロジェクトに同じ名前の新しいビルド構成を追加する。つまり、アプリとSDKプロジェクトの両方に "TestFlight"構成を追加することになりました。これでアーカイブが機能します。

それが最善の方法かどうかはわかりません。しかし、今のところ私には十分きれいに見えます。 :)

ああ、そしてCocoapodsの場合、構成を複製した後、すぐにpod installを実行すると、次の黄色の警告が表示されます。

[!]プロジェクトにはすでにカスタム構成が設定されているため、CocoaPodsはプロジェクトの基本構成を設定しませんでした。 CocoaPods統合を完全に機能させるには、ターゲットの基本構成を設定してください...

プロジェクトの「情報」タブの「構成」セクションに移動し、作成した新しい構成を選択して、すべてのターゲットの「Pods.release」を最初に"None"に設定する必要があります。その後、pod installを安全に実行できます。

4
Hlung

通常、AppStoreスキームがあります(AppStore構成にマップされます)。

私に起こった1つのことは、CocoapodがPods.buildの代わりにRelease-iphonesimulator内のAppStore-iphonesimulatorのビルドフォルダーを生成するという、大文字と小文字を区別する問題でした。

スキームと設定をリンクしたときにクリックを間違えたと思いますが、それを削除して再度追加するだけで、何が悪かったのかがわかりました。差分を確認してください。

sensitive issue

私はcocoapods0.38.2を使用していたので、これは明らかにユーザーの設定ミスであり、 Cocoapodsの問題は解決されていません) on0.34

0
Carlos Ricardo

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
0
Roman Busygin

LibraryまたはFrameworkのプリコンパイル時エラーです

Xcodeがパブリックヘッダーの場所を見つけることができないため、この問題が発生しています。正しいパスを追加して、Xcodeにそれらの場所を伝えるだけです。

次の場合にModule not foundを取得できます。

  • Build Settings -> Header Search Pathsへのライブラリパスが含まれていません
  • Build Settings -> Framework Search Pathsへのフレームワークパスを含めていません
0
yoAlex5