私は別のライブラリ( "bar"と呼ぶ)を利用する共有ライブラリ( "foo"と呼ぶ)を構築しています。 "bar"はOpenSSLのいくつかの機能を利用します。明確に存在する未解決の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'
:だから、明らかにOpenSSLライブラリと間違って何もありません
00000000 T SSL_library_init
:
nm libssl.a | grep SSL_library_init
は、次の出力を生成します。おそらくこのようなことが起こったのだろうか?エラーなしで完了し
export cross=arm-linux-androideabi-
./Configure android --prefix=~/openssl-arm
make CC="${cross}gcc" AR="${cross}ar r" RANLIB="${cross}ranlib"
コンパイルプロセスので、私は全くバッフル付きだ:ここではOpenSSLを構築するために使用される3つのコマンドがあります。
明らかに存在する複数のOpenSSLシンボルを参照するリンカエラーが発生するのはなぜですか?
私は、コンパイラ/リンカーが直線的な順序でシンボルを学習し、順序が狂った状態が発生した場合、それがbarfsであると推測しています。それは逆リニア(fooと依存関係の構築が後方に構築されていることに応じてバーを予期する)でさえある可能性があります。 – RobotHumans