我正在尝试编译一个包含以下内容的小型.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编译,我该怎么办?
答案 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),我认为如果没有在构建配置中显式声明,它将被引用。