我正在尝试编译一个小的.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 include进行编译,我应该做些什么?
7条答案
按热度按时间deyfvvtc1#
你的include路径表明你应该在 * 系统的 * OpenSSL安装中编译。你不应该在你的包目录中有
.h
文件--它应该从/usr/include/openssl
中提取它们。普通的OpenSSL软件包(
libssl
)不包含.h
文件--您还需要安装开发软件包。在Debian、Ubuntu和类似的发行版上,它被命名为libssl-dev
;在CentOS、Fedora、Red Hat和类似的发行版上,它被命名为openssl-devel
。7vux5j2d2#
正确使用
-I
标志进行gcc。gcc -I/path/to/openssl/ -o Opentest -lcrypto Opentest.c
-I
应指向包含openssl
文件夹的目录。vaj7vani3#
使用下面的片段作为所述挑战的解决方案;
在CentOS版本5.4和keepalived版本1.2.7上进行了测试并证明了其有效性。
mwg9r5ms4#
需要包括库路径(-L/usr/local/lib/)
gcc -o Opentest Opentest.c -L/usr/local/lib/ -lssl -lcrypto
对我有用。
cygmwpex5#
如果OpenSSL头位于当前目录的
openssl
子目录中,请用途:预处理器会从
-I
选项中的“.
“和尖括号中指定的名称创建一个名称,如“./openssl/ssl.h
“。如果您指定的名称用双引号括起来(#include "openssl/ssl.h"
),则可能永远不需要问这个问题; Unix上的编译器通常会自动在当前目录中搜索双引号内的头文件,但不会搜索尖括号内的头文件(#include <openssl/ssl.h>
)。这是实现定义的行为。您不必指出OpenSSL库的位置-您可能需要添加一个适当的选项和参数来指定它,例如'
-L /opt/openssl/lib
'。nuypyhwy6#
从openssl.pc文件
你可以注意到包含目录路径和库路径,现在你的包含文件的前缀是
/home/username/Programming
,因此你的包含文件选项应该是-I//home/username/Programming
。(Yes我从上面的评论中得到的)
这只是为了删除有关头文件的日志。您还可以提供
-L<Lib path>
选项来链接-lcrypto
库。wsxa1bj17#
对于此gcc错误,您应该参照gcc document about Search Path。
简而言之:
1)如果您使用尖括号(〈〉)和#include,gcc将首先从系统路径搜索头文件,如 /usr/local/include 和 /usr/include 等。
2)-Ldir 命令行选项指定的路径将在默认目录之前进行搜索。
3)如果您使用引号(“”)与#include一起作为#include“file”,则将首先搜索包含当前文件的目录。
对你的问题,答复如下:
1)如果要在源代码文件夹中使用头文件,请在#include指令中将〈〉替换为“”。
2)如果你想使用-I命令行选项,将它添加到你的编译器命令行。2(如果在环境变量中设置了CFLAGS,它将不会被自动引用)
3)关于包配置(openssl.pc),我不认为它会在构建配置中没有显式声明的情况下被引用。