2017-01-17 18 views
-1

リンクエラーの原因を理解しようとしています。この例は具体的ですが、原因は多分私が理解していない一般原則です。openssl/md5.hが "crypto"ではなく "ssl"とリンクする理由

this postから最小限の例を作りたかったのです。 Ubuntu 14.05.5。私はした:

$ apt-get install libssl-dev 
$ opensll version 
OpenSSL 1.0.1f 6 Jan 2014 
$ echo $LD_LIBRARY_PATH 
/usr/local: 
$ gcc -I/usr/include/openssl -o test md5.c -L/usr/lib/x86_64-linux-gnu -lssl 
/tmp/ccUSgfgs.o: In function `main': 
md5.c:(.text+0x26): undefined reference to `MD5_Init' 
md5.c:(.text+0x68): undefined reference to `MD5_Update' 
md5.c:(.text+0xab): undefined reference to `MD5_Final' 
collect2: error: ld returned 1 exit status 

共通のリンクエラーをスローします。それらのシンボルに定義を見つけることはできません。ランダムな試みを通じて、私はこのビルドが見つかりました:

$ gcc -I/usr/include/openssl -o test md5.c -L/usr/lib/x86_64-linux-gnu -lcrypto  

唯一の違いは、代わりに「-l SSL」の「暗号-l」です

なぜ1つのビルドと他のではないのですか?

+0

[Cで文字列のmd5ハッシュを作成する方法](http://stackoverflow.com/q/7627723)を参照してください。 – jww

答えて

0

libcrypto.aにはlibssl.aではなく定義が含まれています。証明は次のとおりです。

$ nm /usr/lib/x86_64-linux-gnu/libssl.a | grep MD5 
      U MD5_Init 
      U MD5_Transform 

まあ、シンボルの1つはそこにありますが、Uは定義されていません。むしろ:

$ nm /usr/lib/x86_64-linux-gnu/libcrypto.a | grep MD5 
    nm: ebcdic.o: no symbols 
    00000000000001f0 T MD5_Final 
    0000000000000340 T MD5_Init 
    00000000000001e0 T MD5_Transform 
    0000000000000000 T MD5_Update 

記号が定義されています。ケースが解決しました。おそらくドキュメンテーションを読んで、ある程度時間を節約できたでしょう。

関連する問題