24

Copenssl'crypto'ライブラリ関数をcomand行で使用するコード-lcryptoをコンパイルしようとするとgcc 4.4.3、エラーが発生します

`@ubu:$ gcc -ggdb aes_m.c -Werror -Wall -I /usr/local/ssl/include/ -lcrypto -o aes
 /usr/bin/ld: cannot find -lcrypto
 collect2: ld returned 1 exit status`

これの理由は何でしょうか?

私はすでにこの議論を経験しました。ldは既存のライブラリを見つけることができませんが、それは役に立ちません。

位置特定コマンドの結果

$ locate libcrypto
/home/abhi/Downloads/openssl-1.0.1b/libcrypto.a
/home/abhi/Downloads/openssl-1.0.1b/libcrypto.pc
/lib/libcrypto.so.0.9.8
/lib/i486/libcrypto.so.0.9.8
/lib/i586/libcrypto.so.0.9.8
/lib/i686/cmov/libcrypto.so.0.9.8
/usr/lib/libcrypto.so.0.9.8
/usr/lib/vmware-tools/lib32/libcrypto.so.0.9.8
/usr/lib/vmware-tools/lib32/libcrypto.so.0.9.8/libcrypto.so.0.9.8
/usr/lib/vmware-tools/lib64/libcrypto.so.0.9.8
/usr/lib/vmware-tools/lib64/libcrypto.so.0.9.8/libcrypto.so.0.9.8
/usr/local/ssl/lib/libcrypto.a
/usr/local/ssl/lib/pkgconfig/libcrypto.pc

誰かがこれを手伝ってくれるか、私がしている間違いを指摘してもらえますか?

@ Daniel Roethlisbergerは-Lフラグを使用しようとしましたが、これらのエラーが発生しました

gcc -ggdb aes_m.c -Werror -Wall -I /usr/local/ssl/include/ -L /usr/local/ssl/lib -lcrypto -o aes
/usr/local/ssl/lib/libcrypto.a(dso_dlfcn.o): In function `dlfcn_globallookup':
dso_dlfcn.c:(.text+0x2d): undefined reference to `dlopen'
dso_dlfcn.c:(.text+0x43): undefined reference to `dlsym'
dso_dlfcn.c:(.text+0x4d): undefined reference to `dlclose'
/usr/local/ssl/lib/libcrypto.a(dso_dlfcn.o): In function `dlfcn_pathbyaddr':
dso_dlfcn.c:(.text+0x8f): undefined reference to `dladdr'
dso_dlfcn.c:(.text+0xe9): undefined reference to `dlerror'
/usr/local/ssl/lib/libcrypto.a(dso_dlfcn.o): In function `dlfcn_bind_func':
dso_dlfcn.c:(.text+0x4b1): undefined reference to `dlsym'
dso_dlfcn.c:(.text+0x590): undefined reference to `dlerror'
/usr/local/ssl/lib/libcrypto.a(dso_dlfcn.o): In function `dlfcn_bind_var':
dso_dlfcn.c:(.text+0x611): undefined reference to `dlsym'
dso_dlfcn.c:(.text+0x6f0): undefined reference to `dlerror'
/usr/local/ssl/lib/libcrypto.a(dso_dlfcn.o): In function `dlfcn_unload':
dso_dlfcn.c:(.text+0x755): undefined reference to `dlclose'
/usr/local/ssl/lib/libcrypto.a(dso_dlfcn.o): In function `dlfcn_load':
dso_dlfcn.c:(.text+0x837): undefined reference to `dlopen'
dso_dlfcn.c:(.text+0x8ae): undefined reference to `dlclose'
dso_dlfcn.c:(.text+0x8f5): undefined reference to `dlerror'
collect2: ld returned 1 exit status

どうもありがとう

4

2 に答える 2

33

-L /usr/local/ssl/lib/の前に、GCC コマンド ラインに追加し-lcryptoます。の下の OpenSSL ヘッダーに対してビルドしているため/usr/local/ssl、同じプレフィックスの下で実際のライブラリに対してリンクする必要もあります (そこに静的なものしかインストールされていないように見えますが、意図している場合とそうでない場合があります。必要になる場合があります)。ソースからビルドされた OpenSSL を適切に再インストールします)。

(編集)dlopen()リンカが と フレンドを見つけられない問題を修正する-ldlには、GCC コマンド ラインに追加します。、などを-ldl含む共有ライブラリである libdl.so に対してもリンクするようにリンカーに指示します。これらの関数は OpenSSL によって内部的に使用されるため、(Linux 上で)使用する場合は間接的な依存関係になります。libcrypto の静的バージョンにリンクしているため、すべての間接的な依存関係に対して明示的にリンクする必要があります。dlopen()dlsym()dlclose()-ldl-lcrypto

適切なライブラリへのリンクに慣れていない場合は、オペレーティング システムのパッケージ マネージャーからインストールされた OpenSSL を使用することをお勧めします。手間を省けるかもしれません。

于 2012-04-29T00:25:06.453 に答える
11

これは、ソースから独自の openssl を構築し、それを使用して他のプログラム (私の場合は Git) をコンパイルしようとした人々に関連する可能性があります。

openssl の構成中に、「共有」オプションを追加します。

./config shared

これにより、必要な共有ライブラリが作成されますlibcrypto.so。詳細については、INSTALL ファイルを参照してください。

また、「make」中にこのエラーが発生した場合

"....can not be used when making a shared object

-fPIC で再コンパイル

./config shared -fPIC

于 2014-05-28T05:38:13.633 に答える