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

2024-10-24 08:50:00
admin
原创
91
摘要:问题描述:我正在尝试编译一个包含以下内容的小型 .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),我认为如果没有在构建配置中明确声明,它就不会被引用。

相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   601  
  华为IPD与传统研发模式的8大差异在快速变化的商业环境中,产品研发模式的选择直接决定了企业的市场响应速度和竞争力。华为作为全球领先的通信技术解决方案供应商,其成功在很大程度上得益于对产品研发模式的持续创新。华为引入并深度定制的集成产品开发(IPD)体系,相较于传统的研发模式,展现出了显著的差异和优势。本文将详细探讨华为...
IPD流程是谁发明的   7  
  如何通过IPD流程缩短产品上市时间?在快速变化的市场环境中,产品上市时间成为企业竞争力的关键因素之一。集成产品开发(IPD, Integrated Product Development)作为一种先进的产品研发管理方法,通过其结构化的流程设计和跨部门协作机制,显著缩短了产品上市时间,提高了市场响应速度。本文将深入探讨如...
华为IPD流程   9  
  在项目管理领域,IPD(Integrated Product Development,集成产品开发)流程图是连接创意、设计与市场成功的桥梁。它不仅是一个视觉工具,更是一种战略思维方式的体现,帮助团队高效协同,确保产品按时、按质、按量推向市场。尽管IPD流程图可能初看之下显得错综复杂,但只需掌握几个关键点,你便能轻松驾驭...
IPD开发流程管理   8  
  在项目管理领域,集成产品开发(IPD)流程被视为提升产品上市速度、增强团队协作与创新能力的重要工具。然而,尽管IPD流程拥有诸多优势,其实施过程中仍可能遭遇多种挑战,导致项目失败。本文旨在深入探讨八个常见的IPD流程失败原因,并提出相应的解决方法,以帮助项目管理者规避风险,确保项目成功。缺乏明确的项目目标与战略对齐IP...
IPD流程图   8  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

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

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

内置subversion和git源码管理

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

免费试用