gpt4 book ai didi

c - “struct in6_addr”没有名为 ‘s6_addr32’ 的成员,带有 -ansi

转载 作者:太空狗 更新时间:2023-10-29 11:17:57 26 4
gpt4 key购买 nike

在使用 no-asm -ansi 构建 OpenSSL 时,我遇到了一些编译错误。我发现了错误:

$ ./config no-asm -ansi
...
$ make
...
gcc -DDSO_DLFCN -DHAVE_DLFCN_H -DOPENSSL_THREADS -DOPENSSL_NO_STATIC_ENGINE -DOPENSSL_PIC
-DOPENSSLDIR="\"/usr/local/ssl\"" -DENGINESDIR="\"/usr/local/lib/engines\"" -Wall -O3
-pthread -m64 -DL_ENDIAN -ansi -fPIC -Iinclude -I. -Icrypto/include -MMD -MF
crypto/bio/bss_dgram.d.tmp -MT crypto/bio/bss_dgram.o -c -o crypto/bio/bss_dgram.o
crypto/bio/bss_dgram.c
In file included from /usr/include/netdb.h:27:0,
from ./e_os.h:443,
from crypto/bio/bio_lcl.h:2,
from crypto/bio/bss_dgram.c:62:
crypto/bio/bss_dgram.c: In function ‘dgram_get_mtu_overhead’:
crypto/bio/bss_dgram.c:433:20: error: ‘const struct in6_addr’ has no member named ‘s6_addr32’
&& IN6_IS_ADDR_V4MAPPED(&tmp_addr))
^

我在 /usr/include/linux/in6.h 中找到了这个结构:

#if __UAPI_DEF_IN6_ADDR
struct in6_addr {
union {
__u8 u6_addr8[16];
#if __UAPI_DEF_IN6_ADDR_ALT
__be16 u6_addr16[8];
__be32 u6_addr32[4];
#endif
} in6_u;
#define s6_addr in6_u.u6_addr8
#if __UAPI_DEF_IN6_ADDR_ALT
#define s6_addr16 in6_u.u6_addr16
#define s6_addr32 in6_u.u6_addr32
#endif
};
#endif /* __UAPI_DEF_IN6_ADDR */

我不记得过去需要定义 __UAPI_DEF_IN6_ADDR_ALT。搜索它可以从内核的 libc-compat.h 中找到以下内容,第 95 行左右(如果我正确解析它):

#define __UAPI_DEF_IN6_ADDR             1
/* We unconditionally define the in6_addr macros and glibc must coordinate. */
#define __UAPI_DEF_IN6_ADDR_ALT 1
#define __UAPI_DEF_SOCKADDR_IN6 1
#define __UAPI_DEF_IPV6_MREQ 1
#define __UAPI_DEF_IPPROTO_V6 1
#define __UAPI_DEF_IPV6_OPTIONS 1
#define __UAPI_DEF_IN6_PKTINFO 1
#define __UAPI_DEF_IP6_MTUINFO 1

我应该如何继续定义替代符号?


系统为Ubuntu 14.04 (x86_64):

$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 14.04.4 LTS
Release: 14.04
Codename: trusty

海湾合作委员会是:

$ gcc --version
gcc (Ubuntu 4.8.4-2ubuntu1~14.04.1) 4.8.4
Copyright (C) 2013 Free Software Foundation, Inc.

最佳答案

事实证明这很有趣...简而言之,我需要同时添加 -ansi-D_DEFAULT_SOURCE=1 .然而,-D_DEFAULT_SOURCE=1有点撤消什么-ansi正在努力完成,因此需要对其进行控制。

首先,/usr/include/linux/in6.h是错误的 header 。我通过 struct in6_addr 的 grep 找到了它,而不是跟踪包括需要完成的事情。

下一步... -D_DEFAULT_SOURCE=1间接来自/usr/include/netinet/in.h :

#ifndef __USE_KERNEL_IPV6_DEFS
/* IPv6 address */
struct in6_addr
{
union
{
uint8_t __u6_addr8[16];
#ifdef __USE_MISC
uint16_t __u6_addr16[8];
uint32_t __u6_addr32[4];
#endif
} __in6_u;
#define s6_addr __in6_u.__u6_addr8
#ifdef __USE_MISC
# define s6_addr16 __in6_u.__u6_addr16
# define s6_addr32 __in6_u.__u6_addr32
#endif
};
#endif /* !__USE_KERNEL_IPV6_DEFS */

手动启用 __USE_MISC不工作。追踪 __USE_MISC 的事物在/usr/include/features.h :

/*
...
__USE_MISC Define things from 4.3BSD or System V Unix.
...
*/

#undef __USE_MISC
...

#if defined _DEFAULT_SOURCE
# define __USE_MISC 1
#endif

最后,来自 /usr/include/features.h 中的评论:

_DEFAULT_SOURCE The default set of features (taking precedence over __STRICT_ANSI__).

虽然_DEFAULT_SOURCE=1不同于-ansi , 影响可以仅限于受 IN6_IS_ADDR_V4MAPPED 影响的一个源文件.也就是说,对于 C 源文件 crypto/bio/bss_dgram.c :

/* OpenSSL copyright ... */

#ifndef _DEFAULT_SOURCE
# define _DEFAULT_SOURCE 1
#endif

#include <stdio.h>
#include <errno.h>
#include <netinet/in.h>
...

摆弄__USE_KERNEL_IPV6_DEFS让事情变得更糟。我相信它启用了 /usr/include/linux/in6.h ,其成员名称与 <netinet/in.h> 相似(但完全不同) .

关于c - “struct in6_addr”没有名为 ‘s6_addr32’ 的成员,带有 -ansi,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36220341/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com