如何使用 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 <openssl/ssl.h>
)。这是实现定义的行为。
您没有说 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<Lib path>
选项来链接-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 文件包括?的主要内容,如果未能解决你的问题,请参考以下文章