如何使用 OpenSSL 编译 .c 文件包括?

Posted

技术标签:

【中文标题】如何使用 OpenSSL 编译 .c 文件包括?【英文标题】:How to compile .c file with OpenSSL includes? 【发布时间】:2011-03-23 01:44:51 【问题描述】:

我正在尝试编译一个包含以下内容的小型 .c 文件:

#include <openssl/ssl.h>
#include <openssl/rsa.h>
#include <openssl/x509.h>
#include <openssl/evp.h>

在我拥有 .c 文件的同一个文件夹中,我有一个包含所有这些文件(以及更多)的 /openssl,也在突触包管理器中我看到安装了 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 进行编译?

【问题讨论】:

另见 How to compile openssl with relative rpath 和 Build OpenSSL with RPATH? 它确保您在运行时获得预期的库。 【参考方案1】:

您的包含路径表明您应该针对系统的 OpenSSL 安装进行编译。你的包目录中不应该有 .h 文件 - 它应该从 /usr/include/openssl 中获取它们。

普通的 OpenSSL 包 (libssl) 不包含 .h 文件 - 您还需要安装开发包。这在 Debian、Ubuntu 和类似发行版上命名为 libssl-dev,在 CentOS、Fedora、Red Hat 和类似发行版上命名为 libssl-devel

【讨论】:

@jahmax:不用担心。您会发现基于 Debian 的发行版中的大多数库包都有一个 *-dev 包,您需要针对该库进行编译(通常是一个包含该库调试符号的 *-dbg 包)。 正确。 libssl-dev 完成了在 Ubuntu 上构建 osslsigncode-1.5.2 的技巧。 如何在wondows7中安装libssl-dev @Wafeeq 只需复制您的评论并将其粘贴到搜索引擎中。 执行这些步骤后,/usr/include/openssl/ 中显然缺少 params.h【参考方案2】:

使用 -I 标志正确地 gcc。

gcc -I/path/to/openssl/ -o Opentest -lcrypto Opentest.c

-I 应该指向包含openssl 文件夹的目录。

【讨论】:

gcc -I/home/username/Programming/openssl/ -o Opentest -lcrypto Opentest.c 它给了我同样的错误:( 如果openssl文件夹是/path/to/openssl/,那么要详细说明你的答案,那么选项需要是-I/path/to/@jahmax。所以你想要/home/username/Programming/ @Earlz :谢谢,我试图用最后一行明确表示,但它一定被遗漏了。 谢谢,这行得通,但现在我在 openssl/ssl.h 中的包含中遇到错误,其中包含 /openssl/subfolders 中的文件,我怎样才能让 gcc 找到这些文件?跨度> @jah 如果您是“坏人”并且您自己的项目的包含路径(openssl/*)与 OpenSSL 的(可能是 *)不匹配,那么您可能会遇到这个问题。最好的解决方案是将您的项目更改为使用ssl.h 而不是openssl/ssl.h 等。快速解决方法是为/path/to//path/to/openssl/ 设置包含路径【参考方案3】:

使用下面的 sn-p 作为引用挑战的解决方案;

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

预处理器会根据-I 选项中的“.”和尖括号中指定的名称创建一个名称,例如“./openssl/ssl.h”。如果您在双引号中指定了名称 (#include "openssl/ssl.h"),那么您可能永远不需要问这个问题; Unix 上的编译器通常会自动在当前目录中搜索用双引号括起来的头文件,但不会搜索用尖括号括起来的头文件 (#include &lt;openssl/ssl.h&gt;)。这是实现定义的行为。

您没有说 OpenSSL 库在哪里 - 您可能需要添加适当的选项和参数来指定它,例如“-L /opt/openssl/lib”。

【讨论】:

我试过 -L/usr/lib 但我仍然在来自 ssl.h 的所有包含中得到错误,为什么 gcc 找不到它们?【参考方案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

(是的,我是从上面的 cmets 得到的)

这只是为了删除有关标头的日志。您也可以提供-L&lt;Lib path&gt; 选项来链接-lcrypto 库。

【讨论】:

我仍然在 ssl.h 使用的所有包含中遇到错误,为什么 gcc 找不到这些?【参考方案7】:

对于这个gcc错误,你应该参考gcc document about Search Path。

简而言之:

1) 如果在#include 中使用尖括号(),gcc 将首先从系统路径中搜索头文件,例如/usr/local/include/usr/include

2) -Ldir 命令行选项指定的路径,将在默认目录之前搜索。

3)如果你使用quote("") 和#include 作为#include "file",将首先搜索当前文件所在的目录。

所以,你的问题的答案如下:

1) 如果要在源代码文件夹中使用头文件,请将#include 指令中的 替换为“”。

2)如果你想使用-I命令行选项,将它添加到你的编译命令行中。(如果在环境变量中设置CFLAGS,它不会自动引用)

3)关于包配置(openssl.pc),我认为如果没有在构建配置中明确声明,它不会被引用。

【讨论】:

-ldir 是错误的。对于-l,它总是lib 而不是dir @GulluButt 应该是-Ldir。我已经修改了答案。 我遇到了这个问题中提到的类似问题。我正在尝试从下面的链接编译一个示例,但它不起作用。我不确定我的安装是否正常。当我说-lssl 时,它会在openssl 的安装目录中查找ssl.dll 吗? simplestcodings.blogspot.de/2010/08/… @GulluButt,对于 Linux,-lssl 选项将使 gcc 在 libssl.so 或 libssl.a 中搜索所需的符号。 在 Windows 上而非 Linux 上。

以上是关于如何使用 OpenSSL 编译 .c 文件包括?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Windows 下编译 OpenSSL

如何在Windows下编译OpenSSL

如何在 Windows 下编译 OpenSSL

如何在 Windows 下编译 OpenSSL

使用VS2005编译安装openssl1.1.1c

如何在 C/C++ 中使用带有 OpenSSL 的静态链接