如何使用 OpenSSL 包含内容来编译 .c 文件?

2024-10-24 08:50:00
admin
原创
353
摘要:问题描述:我正在尝试编译一个包含以下内容的小型 .c 文件:#include <openssl/ssl.h> #include <openssl/rsa.h> #include <openssl/x509.h> #include <op...

问题描述:

我正在尝试编译一个包含以下内容的小型 .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-develCentOS、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),我认为如果没有在构建配置中明确声明,它就不会被引用。

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   2588  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1553  
  IPD(Integrated Product Development)流程作为一种先进的产品开发管理模式,在众多企业中得到了广泛应用。其中,技术评审与决策评审是IPD流程中至关重要的环节,它们既有明显的区别,又存在紧密的协同关系。深入理解这两者的区别与协同,对于企业有效实施IPD流程,提升产品开发效率与质量具有重要意义...
IPD管理流程   31  
  本文介绍了以下10款项目管理软件工具:禅道项目管理软件、ClickUp、Freshdesk、GanttPRO、Planview、Smartsheet、Asana、Nifty、HubPlanner、Teamwork。在当今快速变化的商业环境中,项目管理软件已成为企业提升效率、优化资源分配和确保项目按时交付的关键工具。然而...
项目管理系统   26  
  建设工程项目质量关乎社会公众的生命财产安全,也影响着企业的声誉和可持续发展。高质量的建设工程不仅能为使用者提供舒适、安全的环境,还能提升城市形象,推动经济的健康发展。在实际的项目操作中,诸多因素会对工程质量产生影响,从规划设计到施工建设,再到后期的验收维护,每一个环节都至关重要。因此,探寻并运用有效的方法来提升建设工程...
工程项目管理制度   21  
热门文章
项目管理软件有哪些?
曾咪二维码

扫码咨询,免费领取项目管理大礼包!

云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用