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

时间:2010-07-30 04:21:34

标签: c linux compiler-construction openssl compiler-errors

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

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

在我拥有.c文件的同一个文件夹中,我有一个/ openssl包含所有这些文件(以及更多),同样在synaptic包管理器中我看到安装了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编译,我该怎么办?

7 个答案:

答案 0 :(得分:99)

您的包含路径表明您应该针对系统的 OpenSSL安装进行编译。您的软件包目录中不应包含.h文件 - 应该从/usr/include/openssl中提取它们。

普通的OpenSSL包(libssl)不包含.h文件 - 您还需要安装开发包。这在Debian,Ubuntu和类似的发行版中命名为libssl-dev,在CentOS,Fedora,Red Hat和类似版本上命名为libssl-devel

答案 1 :(得分:9)

使用-I标志正确gcc。

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

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

答案 2 :(得分:6)

我的英语不是很好 但我在一个中文网页上找到了这个问题的补丁

yum install openssl yum install openssl-devel

安装这个和它的,在centos 5.4和keepalived-1.2.7测试

答案 3 :(得分:4)

如果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 :(得分: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}

您可以从中注意Include目录路径和Libs路径。现在,包含文件的前缀为/home/username/Programming。 因此,您的包含文件选项应为-I//home/username/Programming

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

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

答案 5 :(得分:3)

您需要包含库路径(-L / usr / local / lib /)

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

它对我有用。

答案 6 :(得分:1)

对于此gcc错误,您应引用gcc document about Search Path

简而言之:

1)如果您使用尖括号(&lt;&gt;)和#include,gcc将首先从系统路径搜索头文件,例如 / usr / local / include / usr / include 等。

2)将在默认目录之前搜索-L dir 命令行选项指定的路径。

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

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

1)如果要在源代码文件夹中使用头文件,请替换&lt;&gt;在#include指令中使用“”。

2)如果要使用-I命令行选项,请将其添加到编译命令行。(如果在环境变量中设置CFLAGS,则不会自动引用)

3)关于包配置(openssl.pc),我认为如果没有在构建配置中显式声明,它将被引用。