次を含む小さな.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インクルードでコンパイルするにはどうすればよいですか?
インクルードパスは、システム OpenSSLインストールに対してコンパイルする必要があることを示しています。パッケージディレクトリに.h
ファイルを配置しないでください。/usr/include/openssl
からそれらを選択する必要があります。
プレーンなOpenSSLパッケージ(libssl
)には.h
ファイルが含まれていません-開発パッケージもインストールする必要があります。これは、Debian、Ubuntu、および同様のディストリビューションではlibssl-dev
、CentOS、Fedora、Red Hatなどではlibssl-devel
という名前です。
-I
フラグを使用して、gccを適切に設定します。
gcc -I/path/to/openssl/ -o Opentest -lcrypto Opentest.c
-I
は、openssl
フォルダーを含むディレクトリを指す必要があります。
引用された課題の解決策として以下のスニペットを使用してください。
yum install openssl
yum install openssl-devel
Keepalivedバージョン1.2.7を備えたCentOSバージョン5.4でテストされ、有効であることが証明されました。
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
オプションも提供できます。
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
'のような適切なオプションと引数を追加して指定する必要があるかもしれません。
ライブラリパス(-L/usr/local/lib /)を含める必要があります
gcc -o Opentest Opentest.c -L/usr/local/lib/ -lssl -lcrypto
わたしにはできる。
この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)については、ビルド構成で明示的に宣言せずに参照されるとは思わない。