7

別のライブラリ (「bar」と呼びます) を利用する共有ライブラリ (「foo」と呼びます) を構築しています。「bar」は、OpenSSL のいくつかの機能を利用します。

ここで問題が表面化します。

「bar」はスタティック ライブラリとしてコンパイルされており、OpenSSL もそうであったようです。したがって、ライブラリ (「foo」) をリンクするときは、次のものを含めます。

  • 「foo」のオブジェクトファイル
  • 静的ライブラリlibbar.a
  • OpenSSL スタティック ライブラリlibcrypto.alibssl.a

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

g++ -Wl,-soname,libfoo.so -shared file1.o file2.o libbar.a \
  libcrypto.a libssl.a -o libfoo.so

ただし、大量のエラーが発生します。

ld: ./obj/libbar.a(file1.c.o): in function initialize_openssl:
  ssl.c:117: error: undefined reference to 'SSL_library_init'

次のコマンドを実行します。

nm libssl.a | grep SSL_library_init

次の出力が生成されます。

00000000 T SSL_library_init

したがって、明らかに OpenSSL ライブラリに問題はありません。何がこのようなことを引き起こしたのでしょうか? OpenSSL の構築に使用する 3 つのコマンドを次に示します。

export cross=arm-linux-androideabi-
./Configure android --prefix=~/openssl-arm
make CC="${cross}gcc" AR="${cross}ar r" RANLIB="${cross}ranlib"

コンパイルプロセスはエラーなしで完了したので、私はまったく困惑しています.

明らかに存在する OpenSSL シンボルの束を参照するリンカー エラーが発生するのはなぜですか?

4

1 に答える 1

4

この問題は、link コマンドでのライブラリの順序が原因でした。すべてのシンボルの順序を切り替えてlibcrypto.a解決しました。libssl.a

GCC はLDデフォルトで使用し、シングル パス リンカを使用します。libssllikeとlibcrypto特定の順序でリンクされた2 つのライブラリがある場合、それはlibsslのシンボルに依存することを意味しますlibcrypto。したがって、libssl先行する必要がありますlibcrypto(またはlibcrypto後続する必要がありますlibssl)。libssl. _ libcrypto_ libcrypto_ libssl_

于 2013-03-10T21:34:20.670 に答える