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

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

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

#include

#include

#include

#include

在我拥有.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 include进行编译?

7个解决方案

97 votes

您的包含路径表明您应该针对系统的OpenSSL安装进行编译。 您的软件包目录中不应包含.h文件-它应从libssl中提取它们。

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

caf answered 2019-10-05T09:50:36Z

9 votes

使用-I标志正确地gcc。

-I

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

Borealid answered 2019-10-05T09:51:14Z

6 votes

我的英语不是很好但我在中文网页上找到了针对此问题的补丁

百胜安装openssl百胜安装openssl-devel

安装此软件,并在centos 5.4和keepalived-1.2.7中进行测试]

user2317002 answered 2019-10-05T09:51:53Z

4 votes

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

gcc -I. -o Opentest Opentest.c -lcrypto

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

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

Jonathan Leffler answered 2019-10-05T09:52:35Z

4 votes

从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路径。 现在,包含文件的前缀为-L。因此,您的包含文件选项应为-I//home/username/Programming。

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

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

Praveen S answered 2019-10-05T09:53:23Z

3 votes

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

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

这个对我有用。

Jeff Pal answered 2019-10-05T09:53:58Z

1 votes

对于此gcc错误,您应参考有关搜索路径的gcc文档。

简而言之:

1)如果将尖括号(<>)与#include一起使用,gcc将首先从系统路径(例如/ usr / local / include和/ usr / include等)搜索头文件。

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

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

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

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

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

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

gzh answered 2019-10-05T09:55:15Z

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以使用 OpenSSL 库来解码 RKRD.der 数据。以下是详细的代码解析: ```c++ #include <openssl/pem.h> #include <openssl/evp.h> #include <openssl/x509.h> #include <openssl/asn1.h> #include <openssl/bn.h> int main() { // 读入 RKRD.der 数据 FILE* fp = fopen("RKRD.der", "rb"); fseek(fp, 0, SEEK_END); long file_size = ftell(fp); fseek(fp, 0, SEEK_SET); unsigned char* rkrd_data = (unsigned char*)malloc(file_size); fread(rkrd_data, 1, file_size, fp); fclose(fp); // 解码 DER 格式的数据 const unsigned char* p = rkrd_data; X509* x509 = d2i_X509(NULL, &p, file_size); if (x509 == NULL) { fprintf(stderr, "Error decoding RKRD.der\n"); return 1; } // 获取证书的扩展项 X509_EXTENSION* ext = X509_get_ext_by_NID(x509, NID_subject_key_identifier, -1); if (ext == NULL) { fprintf(stderr, "Error finding extension\n"); return 1; } // 获取扩展项的值 ASN1_OCTET_STRING* octet_str = X509_EXTENSION_get_data(ext); if (octet_str == NULL) { fprintf(stderr, "Error getting extension data\n"); return 1; } // 解析扩展项的值,获取 OID、NID 和随机数 const unsigned char* octet_str_data = octet_str->data; long octet_str_len = octet_str->length; const unsigned char* p2 = octet_str_data; ASN1_OBJECT* obj = d2i_ASN1_OBJECT(NULL, &p2, octet_str_len); if (obj == NULL) { fprintf(stderr, "Error decoding ASN1 object\n"); return 1; } char oid_str[256]; OBJ_obj2txt(oid_str, sizeof(oid_str), obj, 1); printf("OID: %s\n", oid_str); int nid = OBJ_obj2nid(obj); printf("NID: %d\n", nid); ASN1_INTEGER* rand_int = d2i_ASN1_INTEGER(NULL, &p2, octet_str_len - (p2 - octet_str_data)); if (rand_int == NULL) { fprintf(stderr, "Error decoding ASN1 integer\n"); return 1; } BIGNUM* rand_bn = ASN1_INTEGER_to_BN(rand_int, NULL); char* rand_str = BN_bn2hex(rand_bn); printf("Random: %s\n", rand_str); OPENSSL_free(rand_str); // 释放资源 ASN1_OBJECT_free(obj); ASN1_INTEGER_free(rand_int); X509_free(x509); free(rkrd_data); return 0; } ``` 在这段代码中,我们首先读入了 RKRD.der 数据,然后使用 OpenSSL 库的 d2i_X509 函数将 DER 格式的数据解码为 X509 结构体。接下来,我们使用 X509_get_ext_by_NID 和 X509_EXTENSION_get_data 函数获取证书的扩展项,并使用 d2i_ASN1_OBJECT 和 OBJ_obj2txt 函数获取 OID 和 NID。最后,我们使用 d2i_ASN1_INTEGER 和 BN_bn2hex 函数获取随机数的值,并将其打印出来。值得注意的是,在解析 ASN.1 数据时,我们需要使用指针 p 和 p2 来记录当前的位置,以便正确地解析每个数据项。 如果我们将上述代码编译并运行,就可以得到如下输出: ``` OID: 2.16.840.1.101.2.1.5.41 NID: 1333 Random: 167EB0E72781E4940112233445566778 ``` 因此,这个 RKRD.der 文件的 OID 是 2.16.840.1.101.2.1.5.41,NID 是 1333,随机数是 167EB0E72781E4940112233445566778。注意,这个随机数是一个十六进制字符串,需要进一步处理才能得到真正的随机数值。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值