5

試行1、ライブラリへのバニラリンク

パッチを適用したバージョンのOpenSSLを使用しようとしています(DTLSの方が使いやすいです)。OpenSSLは

/usr/local/openssl-1.0.1c

./include/opensslサブフォルダーには、大量のヘッダーファイルがあります(私が想定しているとおり)。

lrwxrwxrwx 1 root root   22 Dec 25 05:49 aes.h -> ../../crypto/aes/aes.h
lrwxrwxrwx 1 root root   24 Dec 25 05:49 asn1.h -> ../../crypto/asn1/asn1.h
lrwxrwxrwx 1 root root   28 Dec 25 05:49 asn1_mac.h -> ../../crypto/asn1/asn1_mac.h
...

GCCはインクルードフォルダにリンクし、エラーが発生します-SSLが見つかりません。私は他の人とほぼ同じものを使用しています。これはOSX(10.6)では機能しますが、Ubuntuでは機能しません。

~$ gcc -L/usr/local/openssl-1.0.1c/include -lssl -lcrypto  -o server server.c
server.c:20:25: fatal error: openssl/ssl.h: No such file or directory
compilation terminated.

試行2、/ usr/include内のライブラリへのシンボリックリンク

そこで、/ usr/includeにOpenSSLへのシンボリックリンクを作成してみます。

sudo ln -s /usr/local/openssl-1.0.1c/include/openssl /usr/include/openssl

コンパイルを再試行します。

~$ gcc -L/usr/local/openssl-1.0.1c/include -lssl -lcrypto  -o server server.c
/usr/bin/ld: cannot find -lssl
/usr/bin/ld: cannot find -lcrypto
collect2: ld returned 1 exit status
make: *** [server] Error 1

最初の方法(つまり、シンボリックリンクがない)が機能しないのはなぜですか?権限?2番目の方法が機能しないのはなぜですか?なぜこれがOSXで機能するのですか?

4

2 に答える 2

9

ヘッダーファイルが見つからないという問題は、オプションを混同しているようです。-Lリンカライブラリの検索パスにパスを-I追加し、プリプロセッサヘッダーファイルの検索パスにディレクトリを追加します。その問題を解決するには、-Lをに変更します。-I

$ gcc -I/usr/local/openssl-1.0.1c/include server.c -o server.o

リンカの問題は-L、インクルードパスでライブラリを探すようにリンカに指示するオプションを誤って使用したことが原因です。そのパスを、ライブラリがあるディレクトリ(通常はサブディレクトリ)に変更する必要がありますlib。また、リンカは依存関係の逆の順序でライブラリを必要とするため、リンクするライブラリをコマンドラインの最後に配置します。

$ gcc -I/usr/local/openssl-1.0.1c/include server.c -o server.o \
    -L/usr/local/openssl-1.0.1c/lib -lssl -lcrypto
于 2013-01-04T03:47:45.350 に答える
3

コンパイルコマンドはOSXで機能しているように見えますが、実際には、必要なバージョンではなく、システムが提供するOpenSSLをコンパイルしてリンクしています。システムOpenSSLのヘッダーと開発ライブラリリンクがインストールされていないため、Ubuntuでは完全に失敗します。

これは、検索パスオプションが混同されており、そのうちの2つが必要なためです。ヘッダーを使用している場所をGCCに通知するには-I。オブジェクトコードライブラリがどこで使用されているかを示すために-L。両方のシステムで必要なコンパイルコマンドは、次のようなものです。

$ gcc -I /usr/local/openssl-1.0.1c/include -L /usr/local/openssl-1.0.1c/lib \
      -o server server.c -lssl -lcrypto
于 2013-01-04T03:52:59.407 に答える