コマンドライン_-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
_
どうもありがとう
_-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を使用することをお勧めします。面倒なことがないかもしれません。
これは、ソースから独自のopensslをビルドし、それを使用して他のプログラム(私の場合はGit)をコンパイルしようとした人に関連する可能性があります
Opensslの構成中に、次のような「共有」オプションを追加します:./config shared
これにより、必要な静的ライブラリlibcrypto.soが作成されます。詳細はINSTALLファイルにあります;)
また、「make」中にこのエラーが発生した場合、「....共有オブジェクトの作成時に使用できません。-fPICで再コンパイルしてください」
-fPICを./configに追加するだけです。
./config shared -fPIC
誰かに教えてほしいが、実際にそれが何をするのか、私は何かを台無しにしないでください:)