linux 如何编译.c文件与OpenSSL包括?

bqujaahr  于 2022-11-22  发布在  Linux
关注(0)|答案(7)|浏览(185)

我正在尝试编译一个小的.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进行编译,我应该做些什么?

deyfvvtc

deyfvvtc1#

你的include路径表明你应该在 * 系统的 * OpenSSL安装中编译。你不应该在你的包目录中有.h文件--它应该从/usr/include/openssl中提取它们。
普通的OpenSSL软件包(libssl)不包含.h文件--您还需要安装开发软件包。在Debian、Ubuntu和类似的发行版上,它被命名为libssl-dev;在CentOS、Fedora、Red Hat和类似的发行版上,它被命名为openssl-devel

7vux5j2d

7vux5j2d2#

正确使用-I标志进行gcc。
gcc -I/path/to/openssl/ -o Opentest -lcrypto Opentest.c
-I应指向包含openssl文件夹的目录。

vaj7vani

vaj7vani3#

使用下面的片段作为所述挑战的解决方案;

yum install openssl
yum install openssl-devel

在CentOS版本5.4和keepalived版本1.2.7上进行了测试并证明了其有效性。

mwg9r5ms

mwg9r5ms4#

需要包括库路径(-L/usr/local/lib/)
gcc -o Opentest Opentest.c -L/usr/local/lib/ -lssl -lcrypto
对我有用。

cygmwpex

cygmwpex5#

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

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

预处理器会从-I选项中的“.“和尖括号中指定的名称创建一个名称,如“./openssl/ssl.h“。如果您指定的名称用双引号括起来(#include "openssl/ssl.h"),则可能永远不需要问这个问题; Unix上的编译器通常会自动在当前目录中搜索双引号内的头文件,但不会搜索尖括号内的头文件(#include <openssl/ssl.h>)。这是实现定义的行为。
您不必指出OpenSSL库的位置-您可能需要添加一个适当的选项和参数来指定它,例如'-L /opt/openssl/lib'。

nuypyhwy

nuypyhwy6#

从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}

你可以注意到包含目录路径和库路径,现在你的包含文件的前缀是/home/username/Programming,因此你的包含文件选项应该是-I//home/username/Programming
(Yes我从上面的评论中得到的)
这只是为了删除有关头文件的日志。您还可以提供-L<Lib path>选项来链接-lcrypto库。

wsxa1bj1

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),我不认为它会在构建配置中没有显式声明的情况下被引用。

相关问题