怎么在 C 代码中知道自己用 C 标准库是 musl libc?
資深大佬 : c137rick 1
Linux 下常见的 C 标准库为 glibc,可以通过宏 __GLIBC__ 识别,但是 musl libc 没有提供类似 __MUSL__ 这样的宏来进行标记(官方解释),那么应该怎么在 C 代码中识别呢?最好不要因为这个写两套代码。
起因就是 glibc 和 musl libc 中 struct in6_addr 的成员名不一样导致编译错误。
/* musl libc 的实现 */ struct in6_addr { union { uint8_t __s6_addr[16]; uint16_t __s6_addr16[8]; uint32_t __s6_addr32[4]; } __in6_union; };
/* glibc 实现 */ #if !__USE_KERNEL_IPV6_DEFS /* IPv6 address */ struct in6_addr { union { uint8_t __u6_addr8[16]; uint16_t __u6_addr16[8]; uint32_t __u6_addr32[4]; } __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 */
目前一个不怎么靠谱的想法是排除法。可以通过宏识别 glibc 、eglibc 和 uclibc 。算上 musl libc 常见的大概也就这四个吧?那么通过宏识别到都不是 glibc 、eglibc 和 uclibc 后,就默认是 musl libc 。但是说实话不太靠谱,因为万一还有别的库就容易出问题。
大佬有話說 (4)