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

2024-10-24 08:50:00
admin
原创
336
摘要:问题描述:我正在尝试编译一个包含以下内容的小型 .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大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1565  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1354  
  信创国产芯片作为信息技术创新的核心领域,对于推动国家自主可控生态建设具有至关重要的意义。在全球科技竞争日益激烈的背景下,实现信息技术的自主可控,摆脱对国外技术的依赖,已成为保障国家信息安全和产业可持续发展的关键。国产芯片作为信创产业的基石,其发展水平直接影响着整个信创生态的构建与完善。通过不断提升国产芯片的技术实力、产...
国产信创系统   21  
  信创生态建设旨在实现信息技术领域的自主创新和安全可控,涵盖了从硬件到软件的全产业链。随着数字化转型的加速,信创生态建设的重要性日益凸显,它不仅关乎国家的信息安全,更是推动产业升级和经济高质量发展的关键力量。然而,在推进信创生态建设的过程中,面临着诸多复杂且严峻的挑战,需要深入剖析并寻找切实可行的解决方案。技术创新难题技...
信创操作系统   27  
  信创产业作为国家信息技术创新发展的重要领域,对于保障国家信息安全、推动产业升级具有关键意义。而国产芯片作为信创产业的核心基石,其研发进展备受关注。在信创国产芯片的研发征程中,面临着诸多复杂且艰巨的难点,这些难点犹如一道道关卡,阻碍着国产芯片的快速发展。然而,科研人员和相关企业并未退缩,积极探索并提出了一系列切实可行的解...
国产化替代产品目录   28  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

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

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

内置subversion和git源码管理

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

免费试用