2013-03-10 41 views
6

私は別のライブラリ( "bar"と呼ぶ)を利用する共有ライブラリ( "foo"と呼ぶ)を構築しています。 "bar"はOpenSSLのいくつかの機能を利用します。明確に存在する未解決の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' 

:だから、明らかに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シンボルを参照するリンカエラーが発生するのはなぜですか?

答えて

3

この問題は、リンクコマンドのライブラリの順番がであるために発生しています。libcrypto.alibssl.aの順番を変更すると、すべての記号が解決されました。

GCCはデフォルトでLDとそのシングルパスリンカーを使用します。 libssllibcryptoのような2つのライブラリが特定の順序でリンクされている場合は、のシンボルに依存するlibsslを意味します。したがって、libsslは、libcryptoの前にある必要があります(またはlibcryptolibsslに従わなければなりません)。 libcryptolibsslで使用される暗号を提供するので、libssllibcryptoに依存しています。

+1

私は、コンパイラ/リンカーが直線的な順序でシンボルを学習し、順序が狂った状態が発生した場合、それがbarfsであると推測しています。それは逆リニア(fooと依存関係の構築が後方に構築されていることに応じてバーを予期する)でさえある可能性があります。 – RobotHumans

関連する問題