Qt : error: declaration of 'xxx' outside of class is not definition

本文介绍了一种常见的编程错误——在方法定义后误加了分号导致的编译失败,并提供了简单有效的解决方案。
你在方法定义的后面都误添加上了“;”,导致编译器认为这仅仅是个声明,去掉“;”就解决了。
                            ^
### 添加多个 IP 地址到 SAN 字段时遇到 `a2i_ipadd` 隐式声明错误的解决方案 在使用 OpenSSL 1.1.1 的 C 语言接口为 X.509 证书添加包含多个 IP 地址的 SAN(Subject Alternative Name)字段时,开发者可能会尝试调用 `a2i_ipadd` 函数来构建 IP 地址条目。然而,在某些编译环境下,可能会出现如下错误信息: ``` error: implicit declaration of function 'a2i_ipadd' ``` 该问题的根本原因在于 `a2i_ipadd` 并不是 OpenSSL 公开 API 中的函数,而是内部使用的辅助函数,未在任何公开头文件中声明。因此,直接调用此函数会导致编译器无法识别其原型并报错[^1]。 --- ### 替代方案:使用 `GENERAL_NAME_new` 和 `ASN1_OCTET_STRING_set` 手动构造 IP 地址条目 为了正确地将 IP 地址添加到 SAN 扩展中,应通过手动构造 `GENERAL_NAME` 对象,并将其封装为 `subjectAltName` 扩展插入证书中。以下是实现方式: #### 构造单个 IPv4 地址的 `GENERAL_NAME` 示例 ```c #include <openssl/x509v3.h> #include <arpa/inet.h> GENERAL_NAME *create_ip_name(const char *ip_str) { GENERAL_NAME *name = GENERAL_NAME_new(); ASN1_OCTET_STRING *ip = ASN1_OCTET_STRING_new(); if (!name || !ip) { // 错误处理 return NULL; } struct in_addr addr; if (inet_aton(ip_str, &addr) <= 0) { // IP 格式错误 GENERAL_NAME_free(name); ASN1_OCTET_STRING_free(ip); return NULL; } ASN1_OCTET_STRING_set(ip, &addr, sizeof(addr)); name->type = GEN_IPADD; name->d.ip = ip; return name; } ``` #### 构造 SAN 扩展并添加到证书 ```c STACK_OF(GENERAL_NAME) *san_names = sk_GENERAL_NAME_new(NULL); GENERAL_NAME *name1 = create_ip_name("192.168.1.1"); GENERAL_NAME *name2 = create_ip_name("10.0.0.1"); if (name1 && name2) { sk_GENERAL_NAME_push(san_names, name1); sk_GENERAL_NAME_push(san_names, name2); } else { // 错误处理 } X509_EXTENSION *ext = X509V3_EXT_i2d(NID_subject_alt_name, 0, san_names); if (ext) { X509_add_ext(cert, ext, -1); X509_EXTENSION_free(ext); } ``` 上述代码通过手动构造 `GENERAL_NAME` 结构体的方式绕过了对 `a2i_ipadd` 的依赖,并确保了与 OpenSSL 1.1.1 的兼容性。 --- ### 注意事项 - 使用 `GEN_IPADD` 类型时,必须确保传入的数据是网络字节序的二进制格式。 - IPv6 地址的构造方式类似,但需要使用 `struct in6_addr` 并设置相应的地址长度。 - 在释放资源时,应逐层释放 `GENERAL_NAME` 和 `ASN1_OCTET_STRING`,避免内存泄漏。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

启文源科技

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值