別のライブラリ (「bar」と呼びます) を利用する共有ライブラリ (「foo」と呼びます) を構築しています。「bar」は、OpenSSL のいくつかの機能を利用します。
ここで問題が表面化します。
「bar」はスタティック ライブラリとしてコンパイルされており、OpenSSL もそうであったようです。したがって、ライブラリ (「foo」) をリンクするときは、次のものを含めます。
- 「foo」のオブジェクトファイル
- 静的ライブラリ
libbar.a
- OpenSSL スタティック ライブラリ
libcrypto.a
とlibssl.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 シンボルの束を参照するリンカー エラーが発生するのはなぜですか?