场景
编译Onvif发现模块,出现如下组播的地址结构体没有定义的问题
onvif_server.c:54:20: 错误:‘mcast’的存储大小未知
struct ip_mreq mcast;
^
make: *** [onvif_server.o] 错误 1
解决
在onvif_server.c文件头文件下面添加如下定义
struct ip_mreq
{
struct in_addr imr_multiaddr;
struct in_addr imr_interface;
};
问题1)引入头文件#include <netinet/in.h>,无效
问题2)Makefile文件指定宏定义-D __USE_GNU, 无效
知识点
1)__BEGIN_DECLS 和__END_DECLS
sys/cdefs.h
#if defined(__cplusplus)
#define __BEGIN_DECLS extern "C" {
#define __END_DECLS }
#else
#define __BEGIN_DECLS
#define __END_DECLS
说明编写代码,经常需要c和c++混合使用,为了使 C 代码和 C++ 代码保持互相兼容的过程调用接口,
需要在 C++ 代码里加上 extern “C” 作为符号声明的一部分,为了简化,从而定义了上面的两个宏方面我们使用
2)内核源码查找结构体或者宏定义
[root@localhost onvif-server-discover]# find / -name "*.h" | xargs grep "struct ip_mreq" -rn
/usr/include/linux/in.h:166:struct ip_mreq {
/usr/include/linux/in.h:171:struct ip_mreqn {
/usr/include/linux/in.h:177:struct ip_mreq_source {
/usr/include/netinet/in.h:265:struct ip_mreq
/usr/include/netinet/in.h:274:struct ip_mreq_source
/usr/include/bits/in.h:152:/* Like `struct ip_mreq' but including interface specification by index. */
/usr/include/bits/in.h:153:struct ip_mreqn
/usr/src/kernels/3.10.0-1062.el7.x86_64/include/linux/igmp.h:62: struct ip_mreqn multi;
/usr/src/kernels/3.10.0-1062.el7.x86_64/include/linux/igmp.h:113:extern int ip_mc_join_group(struct sock *sk, struct ip_mreqn *imr);
/usr/src/kernels/3.10.0-1062.el7.x86_64/include/linux/igmp.h:114:extern int ip_mc_join_group_ssm(struct sock *sk, struct ip_mreqn *imr,
/usr/src/kernels/3.10.0-1062.el7.x86_64/include/linux/igmp.h:116:extern int ip_mc_leave_group(struct sock *sk, struct ip_mreqn *imr);
/usr/src/kernels/3.10.0-1062.el7.x86_64/include/linux/igmp.h:119: struct ip_mreq_source *mreqs, int ifindex);
/usr/src/kernels/3.10.0-1062.el7.x86_64/include/uapi/linux/in.h:166:struct ip_mreq {
/usr/src/kernels/3.10.0-1062.el7.x86_64/include/uapi/linux/in.h:171:struct ip_mreqn {
/usr/src/kernels/3.10.0-1062.el7.x86_64/include/uapi/linux/in.h:177:struct ip_mreq_source {