web-dev-qa-db-ja.com

Xcode 4のビルドは成功しますが、コマンドラインのビルドは失敗しますか?

私は、Xcode 4(最新の非ベータ版)にXcode自体でビルドするとうまくビルドできるプロジェクトがあります。具体的には、Ldコマンドは派生データディレクトリを正しく使用します(依存する静的ライブラリを含むビルド製品が配置される)。

ただし、コマンドラインから同じプロジェクトをビルドすると、プロジェクト内で/ buildフォルダーを使用しようとしてLdコマンドが失敗します。

親プロジェクトと依存プロジェクトの両方で、知っているすべてのビルド設定を調整しようとしました。

これのデバッグを開始する場所についてのアイデアはありますか?必要に応じて詳細情報を提供できます。

編集1:完全なXcodeビルドコマンド:

xcodebuild -project AppName.xcodeproj -target AppName -configuration "Config Name"

ここで、AppNameおよびConfig Nameは両方ともビルドの正しい値です。

編集2:リンク(Ld)コマンド。

Xcodeでビルドした場合(これは機能します):

Ld /Users/james/Library/Developer/Xcode/DerivedData/AppName-apkmkuhwuccsbpblulxcsafyxkwa/Build/Products/Debug-iphonesimulator/AppName.app/AppName normal i386
cd /Users/james/Code/ClientName-Depot/NameOfProject/trunk/AppName
setenv MACOSX_DEPLOYMENT_TARGET 10.6
setenv PATH "/Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin:/Developer/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/X11/bin:/opt/local/bin:/usr/local/git/bin"
/Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin/llvm-gcc-4.2 -Arch i386 -isysroot /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator4.3.sdk -L/Users/james/Library/Developer/Xcode/DerivedData/AppName-apkmkuhwuccsbpblulxcsafyxkwa/Build/Products/Debug-iphonesimulator -L/Users/james/Code/ClientName-Depot/NameOfProject/trunk/AppName -F/Users/james/Library/Developer/Xcode/DerivedData/AppName-apkmkuhwuccsbpblulxcsafyxkwa/Build/Products/Debug-iphonesimulator -filelist /Users/james/Library/Developer/Xcode/DerivedData/AppName-apkmkuhwuccsbpblulxcsafyxkwa/Build/Intermediates/AppName.build/Debug-iphonesimulator/AppName.build/Objects-normal/i386/AppName.LinkFileList -mmacosx-version-min=10.6 -lxml2 -all_load -ObjC -licucore -Xlinker -objc_abi_version -Xlinker 2 -lMyClientLibrary -lxml2 -lsqlite3.0 -framework Security -framework MessageUI -framework QuartzCore -framework MediaPlayer -framework MapKit -framework CoreLocation -framework AudioToolbox -lz.1.2.3 -framework MobileCoreServices -framework SystemConfiguration -framework CFNetwork -framework UIKit -framework Foundation -framework CoreGraphics -o /Users/james/Library/Developer/Xcode/DerivedData/AppName-apkmkuhwuccsbpblulxcsafyxkwa/Build/Products/Debug-iphonesimulator/AppName.app/AppName

上記のビルドコマンドを使用してコマンドラインからビルドした場合(これは失敗します):

Ld "build/AppName.build/Prod Ad Hoc-iphoneos/AppName.build/Objects-normal/armv6/AppName" normal armv6
cd /Users/james/Code/ClientName-Depot/NameOfProject/trunk/AppName
setenv IPHONEOS_DEPLOYMENT_TARGET 4.0
setenv PATH "/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin:/Developer/usr/bin:/opt/local/bin:/opt/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/local/git/bin:/usr/X11/bin:/opt/local/bin"
/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc-4.2 -Arch armv6 -isysroot /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4.3.sdk "-L/Users/james/Code/ClientName-Depot/NameOfProject/trunk/AppName/build/Prod Ad Hoc-iphoneos" -L/Users/james/Code/ClientName-Depot/NameOfProject/trunk/AppName "-F/Users/james/Code/ClientName-Depot/NameOfProject/trunk/AppName/build/Prod Ad Hoc-iphoneos" -filelist "/Users/james/Code/ClientName-Depot/NameOfProject/trunk/AppName/build/AppName.build/Prod Ad Hoc-iphoneos/AppName.build/Objects-normal/armv6/AppName.LinkFileList" -dead_strip -lxml2 -all_load -ObjC -licucore -miphoneos-version-min=4.0 -lMyClientLibrary -lxml2 -lsqlite3.0 -framework Security -framework MessageUI -framework QuartzCore -framework MediaPlayer -framework MapKit -framework CoreLocation -framework AudioToolbox -lz.1.2.3 -framework MobileCoreServices -framework SystemConfiguration -framework CFNetwork -framework UIKit -framework Foundation -framework CoreGraphics -o "/Users/james/Code/ClientName-Depot/NameOfProject/trunk/AppName/build/AppName.build/Prod Ad Hoc-iphoneos/AppName.build/Objects-normal/armv6/AppName"

返されるもの:

ld: library not found for -lMyClientLibrary
collect2: ld returned 1 exit status
Command /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc-4.2 failed with exit code 1
37
James J

わかりました、それでほぼ6(請求可能)時間後、私はビルドをXcodeとコマンドライン(そしてこの演習の全ポイントであるビルドサーバー)で正しく動作するようになりました。

途中で別の問題を引き起こすためにある問題を修正します-リンカ/ Ldの問題を明らかに修正しますが、コンパイルで問題が発生するだけですまたはディレクトリ」エラーが一般的でした)。

見つけることができるほぼすべての設定を調整したのはその時の1つだったので、何が正確に何が間違っていて何が正確に修正されたかを言うのは困難です。

が助けたと思うものは次のとおりです:

  • (プロジェクトとターゲットの代わりに)Xcodeワークスペースとスキームを使用するようにビルドを変換
  • (親/子としてではなく)兄弟としてAppプロジェクトと静的ライブラリを持つようにワークスペースを再配置しました
  • ターゲットで指定されたビルド場所を使用するようにXcodeとワークスペースの設定を変更しました
  • アプリとライブラリのビルド製品パスを変更して../buildを使用します(両方のプロジェクトファイルはマスターディレクトリの兄弟サブフォルダーに含まれているため、同じフォルダーにビルドすることで元のリンカー/ Ldコマンドの問題Ithink
  • ライブラリターゲットを明示的にビルドし、Appターゲットの前にビルドするようにAppスキームを編集しました
  • Appターゲットのビルドフェーズで、「Link Binary With Libraries」の下にライブラリを明示的に追加します
  • ライブラリの.aファイル参照の場所の種類を「製品をビルドする相対」に変更します
  • ライブラリプロジェクトに「ヘッダーをコピー」ビルドフェーズを追加し、パブリックセクションに適切なヘッダーを追加しました
  • ライブラリプロジェクトのパブリックヘッダーフォルダーパスを「/ include」に変更しました
  • ライブラリのインストールディレクトリを$(BUILT_PRODUCTS_DIR)に変更しました
  • Appターゲットのライブラリ検索パスとユーザーヘッダー検索パスを$(BUILT_PRODUCTS_DIR)(再帰的)に変更しました
  • Jenkinsビルドサーバーでビルドする前にCleanコマンドを追加しました
  • ビルドコマンドに明示的なSDKおよびArch引数を追加
  • ビルド構成名からスペースを削除しました

最終的なビルドコマンドは次のようになります。

xcodebuild -workspace ClientName.xcworkspace -scheme AppName -configuration "ProdAdHoc" -sdk iphoneos -Arch "armv6 armv7"

この問題のデバッグ中に使用した有用なリソース:

とにかく、将来的に同様のビルドの問題を抱えている人がこれに出くわし、それが有用であると気付くほど十分なキーワードを上に付けたと思います。 Xcode 4.xに移行したときにXcode 3.xで何度も行ったワークフローがどのように台無しになったかはわかりません。Appleが将来のリリースでこれをクリーンアップできることを願っています。

これは私にとって学習経験のほんの一部であり、これらすべてを経験することは、私が前に持っていたオートコンプリートの問題を解決するように見えました。事態はさらに悪化したかもしれません。私はまだSharePoint用に開発している可能性があります。

42
James J

昨日同じ問題に出くわし、解決することができました。ジェームズのために働いたものを絞り込む努力の中で、私がやらなければならなかったことを指摘します。ワークスペースを追加し、project/targetの代わりにworkspace/schemeでxcodebuildを実行するように切り替える必要がありました。

ワークスペース/スキーマを使用すると、xcodebuildはメインプロジェクトの下のビルド出力フォルダーの代わりにDerivedDataフォルダーを使用するように強制されました。これにより、リンカーは関連する静的ライブラリを見つけることができました。

このブログ投稿は非常に役に立ちました。

http://blog.carbonfive.com/2011/05/04/automated-ad-hoc-builds-using-xcode-4/

10
bromanko

ファイルを試しているときにこのエラーが発生しました。hファイルに@implementationを追加し、.mファイルを空のままにしました。これがあなたのエラーだとは思いませんが、他の誰かがそれを受け取った場合は、あなたがこれを行っていないことを確認してください。

4
Popeye

ヘッダーファイルに.mファイルをインポートしていないかどうかを確認してください。 .mを.hに変更すると、これが修正されました!

2
nemesis

これがうまくいくかどうかはわかりませんが、私の場合、複数のmain.mファイルがありました。私がしなければならなかったのは、ターゲットからmain.mの1つを切り離すだけでした。プロジェクトに複数のmain.mがないことを確認してください。

2
uneakharsh

ビルドのログを見て、すべてのメッセージを確認すると、「link ...」という簡潔な行が表示されますが、詳細はほとんどわかりません。ただし、その行を右クリックして「すべてのトランスクリプトを展開」を選択すると、XCode内から発行されたコマンドを示す非常に詳細な行が表示されます。

これは、問題のデバッグに役立ちます。

デイブ

1
Dave Stampf

同様の例外が発生しました。project.pbxprojでnull参照をクリーンアップした後、project.pbxprojでいくつかの(null)参照を取得したことが判明しました。 Xcode 4プロジェクト:pbxprojファイルをクリーンアップするユーティリティ? utility-to-clean-up-pbxproj-fileをご覧ください

詳細については

1
laiBilly

「ライブラリ検索パス」に移動して問題を解決し、すべてのエントリが正しいことを確認します。

0
Paul

クリーンの後、突然同じ問題が発生しました。最初、私が見たwenでパニックになりました。

linker command failed with exit code 1 (use -v to see invocation)

...しかし、それは非常に簡単に修正できるようになり、コマンドラインは不要です!

ナビゲーターでプロジェクトのルート(上部にあるブループリントアイコンと「A」)をクリックし、PROJECTセクションをクリックし(TARGETセクションもクリックできます)、下部のボタンをクリックしました-「設定の検証」と呼ばれる中間。

XCode自体がプロジェクトファイルを検証し、問題が重複したターゲット定義であり、それを修正することを申し出たことを教えてくれました...

幸運を!

0
Oscar S.

個人的には、_static library_を開発していたときにこの問題が発生しました。すべてのプロダクションコードを含む_static library_ターゲットと、フレームワークとして_MyStaticLib.a_ファイルをプルするテストターゲットがありました。

テストはXcodeで正常に実行されましたが、xcodebuildを使用したターミナルでは実行されませんでした。問題は、_static library_ターゲットが_Standard architectures_向けにコンパイルされていたのに対し、テストターゲットはStandard architectures (including 64-bit)向けにコンパイルしたかったということです。テスト対象を_Standard architectures_に切り替えると、すべてが修正されました。

0
marklar