如何使用OpenSSL编译.c文件?

我正在尝试编译一个小的.c文件,它包含以下内容:

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

在相同的文件夹中,我有.c文件我有一个/ openssl与所有这些文件(和更多),也在突触包pipe理器我看到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进行编译?

包含path表示您应该针对系统的 OpenSSL安装进行编译。 您的软件包目录中不应该有.h文件 – 应该从/usr/include/opensslselect它们。

普通的OpenSSL包( libssl )不包含.h文件 – 您还需要安装开发包( libssl-dev )。

使用-I标志正确地gcc。

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

-I应指向包含openssl文件夹的目录。

我的英文不是很好,但是我在中文网页上find了这个问题的补丁

yum install openssl yum install openssl-devel

安装这个和tha的它,testing在centos 5.4和keepalived 1.2.7]

如果OpenSSL头文件位于当前目录的openssl子目录中,请使用:

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

预处理器将在-I选项中的“ . ”中创build一个名称,例如“ ./openssl/ssl.h ”,并在尖括号中指定名称。 如果你用双引号( #include "openssl/ssl.h" )指定了名字,你可能不需要问这个问题; Unix上的编译器通常会自动在当前目录中search用双引号括起来的头文件,但是对于包含在尖括号( #include <openssl/ssl.h> )中的头文件而言,不这样做。 这是实现定义的行为。

你不会说OpenSSL库在哪里 – 你可能需要添加一个合适的选项和参数来指定,例如' -L /opt/openssl/lib '。

来自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} 

您可以从中注意到Include目录path和Libspath。 现在你的包含文件的前缀是/home/username/Programming 。 因此你的包含文件选项应该是-I//home/username/Programming

(是的,我从上面的评论中得到了它)

这只是删除关于标题的日志。 你也可以提供-L<Lib path>选项来连接-lcrypto库。

对于这个gcc错误,你应该引用关于searchpath的gcc文档 。

简而言之:

1)如果在#include中使用尖括号(<>),gcc将首先从系统path(例如/ usr / local / include/ usr / include等)中search头文件。

2)-L dir命令行选项指定的path将在默认目录之前被search。

3)如果使用#include作为#include“file”使用引号(“”),则会首先search包含当前文件的目录。

所以,你的问题的答案如下:

1)如果要在源代码文件夹中使用头文件,请在#include指令中将“>”replace为“”。

2)如果你想使用-I命令行选项,把它添加到你的编译命令行(如果在环境variables中设置CFLAGS,它将不会自动引用)

3)关于软件包configuration(openssl.pc),我不认为它会被引用没有显式声明在构buildconfiguration。