web-dev-qa-db-ja.com

OpenSSLインクルードで.cファイルをコンパイルする方法は?

次を含む小さな.cファイルをコンパイルしようとしています。

#include <openssl/ssl.h>
#include <openssl/rsa.h>
#include <openssl/x509.h>
#include <openssl/evp.h>

私が.cファイルを持っている同じフォルダに、それらのすべてのファイル(およびそれ以上)を含む/ opensslがあり、シナプスパッケージマネージャにもOpenSSLがインストールされているのを見て、これでコンパイルしようとしています:

gcc -o Opentest Opentest.c -lcrypto

しかし、私は常にエラーが発生します:

error: openssl/ssl.h: No such file or directory
error: openssl/rsa.h: No such file or directory
error: openssl/x509.h: No such file or directory
error: openssl/evp.h: No such file or directory

コンパイルしたいファイルは.cファイルのみで、Makefileや./configureはありません。

私はすでに試しました:

env CFLAGS=-I/path/to/openssl/

もう一度コンパイルしようとしましたが、同じエラーが発生します。

Opensslインクルードでコンパイルするにはどうすればよいですか?

66
jahmax

インクルードパスは、システム OpenSSLインストールに対してコンパイルする必要があることを示しています。パッケージディレクトリに.hファイルを配置しないでください。/usr/include/opensslからそれらを選択する必要があります。

プレーンなOpenSSLパッケージ(libssl)には.hファイルが含まれていません-開発パッケージもインストールする必要があります。これは、Debian、Ubuntu、および同様のディストリビューションではlibssl-dev、CentOS、Fedora、Red Hatなどではlibssl-develという名前です。

99
caf

-Iフラグを使用して、gccを適切に設定します。

gcc -I/path/to/openssl/ -o Opentest -lcrypto Opentest.c

-Iは、opensslフォルダーを含むディレクトリを指す必要があります。

9
Borealid

引用された課題の解決策として以下のスニペットを使用してください。

yum install openssl
yum install openssl-devel

Keepalivedバージョン1.2.7を備えたCentOSバージョン5.4でテストされ、有効であることが証明されました。

6
user2317002

Openssl.pcファイルから

prefix=/usr
exec_prefix=${prefix}
libdir=${exec_prefix}/lib
includedir=${prefix}/include

Name: OpenSSL
Description: Secure Sockets Layer and cryptography libraries and tools
Version: 0.9.8g
Requires:
Libs: -L${libdir} -lssl -lcrypto
Libs.private: -ldl -Wl,-Bsymbolic-functions -lz
Cflags: -I${includedir}

これから、インクルードディレクトリパスとLibsパスをメモできます。これで、インクルードファイルのプレフィックスは/home/username/Programmingです。したがって、インクルードファイルオプションは-I//home/username/Programmingである必要があります。

(はい、私は上記のコメントからそれを得ました)

これは、ヘッダーに関するログを削除するだけです。 -L<Lib path>ライブラリとリンクするための-lcryptoオプションも提供できます。

4
Praveen S

OpenSSLヘッダーが現在のディレクトリのopensslサブディレクトリにある場合は、次を使用します。

gcc -I. -o Opentest Opentest.c -lcrypto

プリプロセッサは、./openssl/ssl.hオプションの「.」と山括弧で指定された名前から「-I」などの名前を作成しようとします。二重引用符(#include "openssl/ssl.h")で名前を指定した場合、質問をする必要はないかもしれません。 Unix上のコンパイラは通常、現在のディレクトリで二重引用符で囲まれたヘッダーを自動的に検索しますが、山括弧(#include <openssl/ssl.h>)で囲まれたヘッダーは検索しません。実装定義の動作です。

OpenSSLライブラリがどこにあるかは言いません-'-L /opt/openssl/lib'のような適切なオプションと引数を追加して指定する必要があるかもしれません。

4

ライブラリパス(-L/usr/local/lib /)を含める必要があります

gcc -o Opentest Opentest.c -L/usr/local/lib/ -lssl -lcrypto

わたしにはできる。

4
Jeff Pal

このgccエラーについては、 検索パスに関するgccドキュメント を参照する必要があります。

要するに:

1)#includeで不等号括弧(<>)を使用する場合、gccは/ usr/local/includeなどのシステムパスから最初にヘッダーファイルを検索しますおよび/ usr/includeなど.

2)-Ldirコマンドラインオプションで指定されたパスは、デフォルトディレクトリの前に検索されます。

3)#includeを#include "file"としてquote( "")を使用すると、現在のファイルを含むディレクトリが最初に検索されます。

したがって、あなたの質問に対する答えは次のとおりです。

1)ソースコードフォルダーでヘッダーファイルを使用する場合は、#includeディレクティブで<>を ""に置き換えます。

2)-Iコマンドラインオプションを使用する場合は、コンパイルコマンドラインオプションに追加します(環境変数にCFLAGSを設定すると、自動的に参照されません)。

3)パッケージ構成(openssl.pc)については、ビルド構成で明示的に宣言せずに参照されるとは思わない。

1
gzh