2016-09-27 6 views
0

私はRed Hat Enterprise Linux Serverリリース7.0(Maipo)で作業しています。サーバーはOpenSSL 1.0.1を提供します。 OpenSSLにリンクしようとすると、多くの暗号エラーが発生します。ここで`[email protected] '(および他のもの)への未定義の参照

は私のリンクコマンドのコマンドラインは、(コマンドラインでのような順序)である:私は実行しているとき

/lib64/libssl.so.10: undefined reference to `[email protected]' 
/lib64/libssh2.so.1: undefined reference to `[email protected]' 
/lib64/libssl.so.10: undefined reference to `[email protected]' 
/lib64/libssl.so.10: undefined reference to `[email protected]' 
/lib64/libssl.so.10: undefined reference to `[email protected]' 
/lib64/libssl.so.10: undefined reference to `[email protected]' 
/lib64/libssl.so.10: undefined reference to `[email protected]' 
/lib64/libssh2.so.1: undefined reference to `[email protected]' 
/lib64/libssl.so.10: undefined reference to `[email protected]' 
/lib64/libssl.so.10: undefined reference to `[email protected]' 
/lib64/libssl.so.10: undefined reference to `[email protected]' 
/lib64/libssl.so.10: undefined reference to `[email protected]' 
/lib64/libssh2.so.1: undefined reference to `[email protected]' 
/lib64/libssl.so.10: undefined reference to `[email protected]' 
/lib64/libssl.so.10: undefined reference to `[email protected]' 
... 

ll /usr/lib64/libcrypto.so 
をここで

g++ -g -O2 -Wl,-rpath -o output file1.o libprivate_lib1.so -Lprivate_path -llib1 -ldl \ 
-lpthread -llib2 -lexpat -lgtest -lgtest_main -lboost_regex -lboost_filesystem -llzma \ 
-lcrypto private_lib2.so private_lib3.so -llib3 

は、エラーの一部です

取得中

/usr/lib64/libcrypto.so -> libcrypto.so.1.0.1e 

し、実行:

objdump -tT /usr/lib64/libcrypto.so.1.0.1e | grep COMP_zlib 

私はそれが私がこのライブラリでそれを持っていることを意味し

000000000013e500 g DF .text 0000000000000002 libcrypto.so.10 COMP_zlib_cleanup 
000000000013e460 g DF .text 000000000000009e libcrypto.so.10 COMP_zlib 

を取得します。 最も奇妙なことは、Redhat 6.5/4ではリンクできますが、7より上のRedhatでは失敗しているということです。 提案はありますか?

+0

質問は不明であり、潜在的な原因がたくさんある可能性があります。リンクしようとしているものや使用しているツールのバージョン、CLIの使用方法(CLIの引数など)はわかりません。 – ray

+0

おそらく、あなたはlibcryptoにリンクするのを忘れましたか? libsslにリンクするフラグの後に '-lcrypto'リンクフラグ**を追加してください。あるいは、Red Hat 7.0と互換性のないマシンでコンパイルした互換性のないライブラリにリンクしようとしているかもしれません。いずれにしても、問題を詳細に記述することをお勧めします。この出力を生成した実際のコマンドを表示してください。 – nos

+0

私はcrypto lib(コマンドラインを追加)とリンクしています。私はそれがredhat 6.5/4でコンパイルできるので、redhat 7.に関連していると思います。 – yehudahs

答えて

0

COMP_zlibおよびEVP_get_cipherbynameのような機能は、暗号化ライブラリではなくOPenSSL SSLライブラリの一部です。あなたは-lcryptoを持っていますが、-lsslが不足しているように見える:

g++ -g -O2 -Wl,-rpath -o output file1.o libprivate_lib1.so -Lprivate_path -llib1 -ldl \ 
-lpthread -llib2 -lexpat -lgtest -lgtest_main -lboost_regex -lboost_filesystem -llzma \ 
-lcrypto private_lib2.so private_lib3.so -llib3 

あなたは-lssl -lcryptoに変更する必要があります。

g++ -g -O2 -Wl,-rpath -o output file1.o libprivate_lib1.so -Lprivate_path -llib1 -ldl \ 
-lpthread -llib2 -lexpat -lgtest -lgtest_main -lboost_regex -lboost_filesystem -llzma \ 
-lssl -lcrypto private_lib2.so private_lib3.so -llib3 

private_lib2.so private_lib3.soはそれらの後に移動する必要が-lssl -lcrypto、その後、OpenSSLの依存場合。つまり、private_lib2.so private_lib3.so -lssl -lcryptoを使用します。

libsshは、-lssl -lcryptoに進む必要があります。私はどこにリンクされているかわかりませんが、図書館は別の名前で行くかもしれません。最後に、ライブラリリスト<other libs> ... -lssl -lcrypto -llzma -pthreadを使用するほうが簡単かもしれません。

OpenSSLの新しいバージョンまたは異なるバージョンが存在する可能性もありますが、その設定は異なっています。たとえば、Red Hatは圧縮(./configure no-comp ...)を削除しますが、ヘッダーはCOMP_zlibのようなシンボルを持ち込んでいるようです。

次のステップは、(1)一般的なコンパイルコマンドを表示し、(2)g++ -vを入力して、ヘッダー検索パスを確認することです。

最後に、g++を使用していることを覚えておいてください。リンクはデフォルトでextern "C++"になります。

#ifdef __cplusplus 
extern "C" { 
#endif 

... 

#ifdef __cplusplus 
} 
#endif 

私は、Red Hatのサーバーへのアクセスを持っていないので、私は確かに知っていない:それはそれらの古いOpenSSLのヘッダーの1つ慣習に欠ける可能性があります。私はCentOSとFedoraの両方を使って別のライブラリをテストしますが、時々違いがあることは分かっています。

関連する問題