如何使用 OpenSSL 包含内容来编译 .c 文件?
- 2024-10-24 08:50:00
- admin 原创
- 91
问题描述:
我正在尝试编译一个包含以下内容的小型 .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 包含的内容进行编译?
解决方案 1:
您的包含路径表明您应该针对系统的OpenSSL 安装进行编译。您不应该将这些.h
文件放在您的软件包目录中 - 它应该从 中选取它们/usr/include/openssl
。
普通的 OpenSSL 包 ( libssl
) 不包含.h
文件 - 您还需要安装开发包。这libssl-dev
在 Debian、Ubuntu 和类似发行版以及openssl-devel
CentOS、Fedora、Red Hat 和类似发行版上都有名称。
解决方案 2:
正确使用-I
标志来 gcc。
gcc -I/path/to/openssl/ -o Opentest -lcrypto Opentest.c
应该-I
指向包含该openssl
文件夹的目录。
解决方案 3:
使用下面的代码片段作为所述挑战的解决方案;
yum install openssl
yum install openssl-devel
经过在CentOS 5.4版本和keepalived 1.2.7版本上测试,证明是有效的。
解决方案 4:
您需要包含库路径(-L / usr / local / lib /)
gcc -o Opentest Opentest.c -L/usr/local/lib/ -lssl -lcrypto
它对我有用。
解决方案 5:
如果 OpenSSL 标头位于openssl
当前目录的子目录中,请使用:
gcc -I. -o Opentest Opentest.c -lcrypto
预处理器会根据选项中的“ ”和尖括号中指定的名称创建一个名称,./openssl/ssl.h
例如“ .
” 。如果您已在双引号 ( ) 中指定名称,则可能永远不需要询问该问题;Unix 上的编译器通常会自动在当前目录中搜索用双引号括起来的标头,但对于用尖括号 ( ) 括起来的标头,它不会这样做。这是实现定义的行为。-I
`#include "openssl/ssl.h"`#include <openssl/ssl.h>
您没有说 OpenSSL 库在哪里 - 您可能需要添加适当的选项和参数来指定,例如“ -L /opt/openssl/lib
”。
解决方案 6:
来自 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
。
解决方案 7:
对于这个 gcc 错误,您应该参考gcc 文档中关于搜索路径的部分。
简而言之:
1)如果在#include 中使用尖括号(<>),gcc 将首先从系统路径(例如/usr/local/include和/usr/include等)中搜索头文件。
2)由 -L dir命令行选项指定的路径将在默认目录之前进行搜索。
3)如果在#include 中使用引号(“”)作为#include “file”,则将首先搜索包含当前文件的目录。
因此,您的问题的答案如下:
1)如果您想使用源代码文件夹中的头文件,请在#include 指令中将 <> 替换为 ""。
2)如果您想使用 -I 命令行选项,请将其添加到您的编译命令行中。(如果在环境变量中设置了 CFLAGS,它将不会自动引用)
3)关于包配置(openssl.pc),我认为如果没有在构建配置中明确声明,它就不会被引用。
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件