web-dev-qa-db-ja.com

libcryptoライブラリエラーが見つかりません

コマンドライン_-lcrypto_と_gcc 4.4.3_でopenssl 'crypto'ライブラリ関数を使用するCコードをコンパイルしようとするとエラーが発生します

_`@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コマンドの結果

_$ 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
_

どうもありがとう

24
abhi

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

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

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

33

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

Opensslの構成中に、次のような「共有」オプションを追加します:./config shared

これにより、必要な静的ライブラリlibcrypto.soが作成されます。詳細はINSTALLファイルにあります;)

また、「make」中にこのエラーが発生した場合、「....共有オブジェクトの作成時に使用できません。-fPICで再コンパイルしてください」

-fPICを./configに追加するだけです。

./config shared -fPIC

誰かに教えてほしいが、実際にそれが何をするのか、私は何かを台無しにしないでください:)

10
Daniel Hollas