iPhone用のlibgcryptをクロスコンパイルしますか?リンカーエラー… “ fwrite”が見つからないようですおよび“ strerror&#8221 ;?

StackOverflow https://stackoverflow.com/questions/1620375

質問

GNU Autotoolsを起動するスクリプトを構成" ./ configure"必要なクロスコンパイルオプションを使用します。

私は現在libtasn1とlibgcryptに依存するGNUTLSをクロスコンパイルしようとしていますが、これはlibgpg-errorに依存しています。これは私が問題に直面している場所であり、あなたの助けを使うことができます...

現在、libgpg-errorをクロスコンパイルしようとしています。前に使用した構成スクリプトは美しく機能しています。 " ./ configure"プロセスは完全に完了します。 「make」を実行すると問題が発生します。 makeを実行すると、すべてがコンパイルされているように見えますが、最後に次の厄介なリンカーエラーが発生します。

/bin/sh ../libtool --tag=CC   --mode=link /Users/michaelsafyan/Downloads/libgpg-error-1.7/compile /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc-4.2  -std=c99 -arch armv6 -pipe -no-cpp-precomp --sysroot='/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.0.sdk' -isystem /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.0.sdk/usr/lib/gcc/arm-apple-darwin9/4.2.1/include/ -isystem /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.0.sdk/usr/include -isystem /Developer/Platforms/iPhoneOS.platform/Developer/usr/include -isystem /opt/iphone-3.0/include -isystem /usr/local/iphone-3.0/include  -arch armv6 --sysroot='/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.0.sdk' -L/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.0.sdk/usr/lib -L/Developer/Platforms/iPhoneOS.platform/Developer/usr/lib -L/opt/iphone-3.0/lib -L/usr/local/iphone-3.0/lib -o gpg-error gpg_error-strsource-sym.o gpg_error-strerror-sym.o gpg_error-gpg-error.o  ./libgpg-error.la  
/Users/michaelsafyan/Downloads/libgpg-error-1.7/compile /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc-4.2 -std=c99 -arch armv6 -pipe -no-cpp-precomp --sysroot=/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.0.sdk -isystem /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.0.sdk/usr/lib/gcc/arm-apple-darwin9/4.2.1/include/ -isystem /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.0.sdk/usr/include -isystem /Developer/Platforms/iPhoneOS.platform/Developer/usr/include -isystem /opt/iphone-3.0/include -isystem /usr/local/iphone-3.0/include -arch armv6 --sysroot=/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.0.sdk -o gpg-error gpg_error-strsource-sym.o gpg_error-strerror-sym.o gpg_error-gpg-error.o  -L/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.0.sdk/usr/lib -L/Developer/Platforms/iPhoneOS.platform/Developer/usr/lib -L/opt/iphone-3.0/lib -L/usr/local/iphone-3.0/lib ./.libs/libgpg-error.a
Undefined symbols:
  "_fwrite$UNIX2003", referenced from:
      _main in gpg_error-gpg-error.o
  "_strerror$UNIX2003", referenced from:
      _gpg_strerror in libgpg-error.a(libgpg_error_la-strerror.o)
ld: symbol(s) not found
collect2: ld returned 1 exit status
make[3]: *** [gpg-error] Error 1
make[2]: *** [all] Error 2
make[1]: *** [all-recursive] Error 1
make: *** [all] Error 2

これを機能させる方法についてのアイデアはありますか?コンパイルしているソフトウェアのバージョンは次のとおりです。

      
  • libgpg-error:1.7
  •   
  • libgcrypt:1.4.4
  •   
  • libtasn1:2.2
  •   
  • gnutls:2.8.4

助けてください。ありがとう。

更新

最初のフィードバックによると、各SDKには" libSystem.dylib"のコピーがあります。 " $ SDKROOT / usr / lib"にあります。 " $ DEVROOT / usr / lib"にはlibSystemのコピーはありません。ここで、

      
  • $ DEVROOT =" /Developer/Platforms/iPhoneOS.platform/Developer"
  •   
  • $ SDKROOT =" $ DEVROOT / SDKs / iPhoneOS $ VER.sdk"

" libSystem"ライブラリには、各シンボルの通常の装飾されていないバージョンが含まれますが、" $ UNIX2003"は含まれません。シンボルのバリアント。 GPG-ERRORが" _POSIX_C_SOURCE"、" _UNIX&quot ;、または別のUNIX機能テストマクロを定義しており、" $ UNIX2003"これらの機能テストマクロが存在する場合の機能に含まれています。 " $ DEVROOT / usr / include"の削除このエラーメッセージの削除に関しては、インクルードディレクトリのリストからの影響はありません。

最後の手段として、「ld」は" -alias_list"を受け入れます。 " _fwrite _fwrite $ UNIX2003"のようなエントリを持つファイルを指定できるオプション。これらの未定義のシンボルを装飾されていないバリアントに強制的に解決します。可能であれば、このオプションはハック的で危険な可能性があるため、避けたいと思います。

役に立ちましたか?

解決

通常、未解決の symbol $ UNIX2003 は、 既存のオブジェクトファイルが作成されたSDKよりも古いSDKにリンクしていること

私への道を含む奇妙な見方が1つありますが、私はMacの開発については漠然としか知らず、iPhoneの開発についてはまったく知らないことに注意してください

/Developer/Platforms/iPhoneOS.platform/Developer/usr/include

実際にはSDKフォルダーにはありません。そこから不正なシンボルを拾った可能性はありますか? SDKのインクルードパスよりもコマンドラインの後半で発生するため、考えられないようです。

代わりに、シンボルは _fwrite および _strerror の期待されるバージョンであるため、 gpg_error-gpg-error.o および libgpg -error.a は大丈夫であり、実際にはリンクの問題です。

/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.0.sdk/usr/lib

-Lオプションとして。どこかにlibSystem dylibがあると仮定していますか?

最初にすべきことは、UNIX2003バージョンのシンボルが期待どおりかどうかを確認することだと思います。私の推測ではそうですが、私が言うように、私は完全に間違っている可能性があります。 :)

次に、 ld から詳細な出力を取得して、シンボルの検出場所を確認できます。これを実現するために設定できる環境変数があるはずですが、 ld のオンラインmanページにリストされているものは見当たりません。 (更新:2つのenv変数は LD_TRACE_ARCHIVES LD_TRACE_DYLIBS ですが、おそらく-t?と同じになります。)

編集:

OK、だから私はUNIX2003のシンボルが必要なものであることについて完全に間違っていた。笑。

libgpg-errorをビルドしたとき、ファイルが作成されたと思います

src / .deps / gpg_error-gpg-error.Po

これにはヘッダーの依存関係が含まれます(少なくともLinuxシステムではそうでした)。これは、gpg_error-gpg-error.oをビルドするときに間違ったヘッダーをどこで取得したかについての手がかりを与えるかもしれません。

ところで、libgpg-error configureスクリプトが -isysroot -arch の両方のオプションを受け入れるように見えます。独自のバージョンのconfigureスクリプトの代わりにこれらを使用することはできませんか?

Edit2:

さて、もう一度行ってみましょう:)クリーンなソースフォルダーから始めて、いくつか試してみてください:

  • -sysrootの代わりに-isysrootを使用します
  • -isysrootおよび--sysroot
  • を使用します
  • たとえば、フォルダの名前を変更するなどして、通常のシステムヘッダーを一時的に使用不可にします。うまくいけば、ビルドが失敗してヘッダーが見つからず、正確な場所がわかります。

他のヒント

gpg_error-gpg-error.cを-Eで前処理してから、欠落しているシンボルを検索してみてください。含まれている場所(asm(" _"" nice"" @ UNIX2003")のようなもの)を見つける必要があります。 次に、このヘッダーを変更します(たとえば、#warning" HERE"を追加するには、unistd.h)。 次に、再コンパイルすると、インクルードスタックが見つかるはずです。

$ 2003接尾辞は、compatのマニュアルエントリで完全に文書化されている特定の状況でコンパイラによって生成されます

man compat

設定して最終的に修正する前に、しばらくこれと格闘しました

-mmacosx-version-min = 10.3

10.4より前のどのバージョンでもジョブを実行します。 Troubadourの答えを考えれば、ldの-tオプションを使用して、誤ってリンクされたライブラリを検索する方が良いと思われます

これがお役に立てば幸いです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top