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


72

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

在我拥有.c文件的同一文件夹中,我拥有带有所有这些文件(以及更多文件)的/ openssl,也在突触包管理器中,我看到安装了OpenSSL,我正在尝试使用以下方法进行编译:

但我总是得到错误:

我要编译的文件只是一个.c文件,没有Makefile或./configure。

我已经尝试过:

并尝试再次编译,但我得到相同的错误。

我应该怎么做才能用openssl include进行编译?


另请参阅如何编译OpenSSL的相对rpath的构建OpenSSL的与RPATH?它确保您在运行时获得期望的库。
jww

Answers:


110

您的包含路径表明您应该针对系统的OpenSSL安装进行编译。您不应该将.h文件放在包目录中-应该从中进行选择/usr/include/openssl

普通的OpenSSL软件包(libssl)不包含.h文件-您还需要安装开发软件包。它libssl-dev在Debian,Ubuntu和类似发行版上以及libssl-develCentOS,Fedora,Red Hat和类似版本上被命名。


@jahmax:不用担心。您会发现,基于Debian的发行版中的大多数库软件包都有*-dev您需要针对该库进行编译的*-dbg软件包(通常是一个包含该库调试符号的软件包)。
caf 2010年

2
对了 libssl-dev完成了在Ubuntu上构建osslsigncode-1.5.2的技巧。
karmakaze

3
如何libssl-dev在wondows7中安装?
Wafeeq

1
@Wafeeq只复制您的评论并将其粘贴到搜索引擎中。
emc

遵循以下步骤后,显然在/ usr / include / openssl /中缺少params.h
Reeshabh Ranjan

11

使用该-I标志正确地gcc。

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

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


2
gcc -I / home / username / Programming / openssl / -o Opentest -lcrypto Opentest.c它给了我同样的错误:(
jahmax

2
要详细说明您的答案(如果openssl文件夹是,/path/to/openssl/则该选项需要为-I/path/to/@jahmax)。所以你想要/home/username/Programming/
Earlz

@Earlz:谢谢,我试图在最后一个显式行中说,但一定是错过了。
Borealid

谢谢,那行得通,但是现在我在openssl / ssl.h内的include中出现错误,其中包括/ openssl / subfolders内的文件,我怎样才能让gcc找到那些?
jahmax

@jah如果您处于“不良”状态,并且您自己的项目的include path(openssl/*)与OpenSSL的(可能*)不匹配,那么您可能会遇到此问题。最好的解决方案是更改项目的使用方式,ssl.h而不是使用其他方式openssl/ssl.h。快速解决方案是同时为/path/to/和设置包含路径/path/to/openssl/
Earlz 2010年

10

使用下面的代码段作为所引用挑战的解决方案;

经过测试并证明在带有keepalived版本1.2.7的CentOS版本5.4上有效。


6

您需要包括库路径(-L / usr / local / lib /)

gcc -o Opentest Opentest.c -L/usr/local/lib/ -lssl -lcrypto

这个对我有用。


4

如果OpenSSL标头位于openssl当前目录的子目录中,请使用:

预处理程序希望通过选项中./openssl/ssl.h的“ .”创建一个名称,例如“ ”-I和尖括号中指定的名称。如果您在双引号(#include "openssl/ssl.h")中指定了名称,那么您可能根本不需要问这个问题。Unix上的编译器通常会自动在当前目录中搜索用双引号引起来的标头,但对于在尖括号(#include <openssl/ssl.h>)中引起的标头则不会这样做。它是实现定义的行为。

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


我试过-L / usr / lib但我仍然从ssl.h中得到所有包含的错误,为什么gcc找不到它们?
jahmax 2010年

4

从openssl.pc文件

您可以从中记下Include目录路径和Libs路径。现在,包含文件的前缀为/home/username/Programming。因此,您的包含文件选项应为-I//home/username/Programming

(是的,我从上面的评论中得到了它)

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


我仍然在ssl.h使用的所有包含文件中都出现错误,为什么gcc找不到这些?
jahmax 2010年

1

对于此gcc错误,您应该参考有关Search Pathgcc文档

简而言之:

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

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

3)如果在#include中使用quotation(“”)作为#include“ file”,则将首先搜索包含当前文件的目录。

因此,您的问题的答案如下:

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

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

3)关于包配置(openssl.pc),我认为在构建配置中未明确声明的情况下将不会引用它。


-ldir是错的。与-l,它总是lib代替dir
Wafeeq

1
@GulluButt应该是-Ldir。我已经修改了答案。
gzh17年

我有这个问题中提到的类似问题。我正在尝试从下面的链接编译一个示例,但是它不起作用。我不确定我的安装是否正常。当我说时-lssl,它ssl.dll在安装目录中寻找opensslsimplestcodings.blogspot.de/2010/08/…–
Wafeeq

@GulluButt,对于Linux,-lssl选项将使gcc在libssl.so或libssl.a中搜索所需的符号。
gzh17年

在Windows而非Linux上。
Wafeeq
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.