ios - 架构 arm64 的 undefined symbol : "getdefaultgateway(unsigned int*)"

标签 ios objective-c c networking

我正在尝试获取我所连接的 wifi 的网关 IP 地址。我正在使用此 question 中的答案但我在代码上遇到错误。

当我在我的项目中使用它时

- (NSString *)getGatewayIP {
    NSString *ipString = nil;
    struct in_addr gatewayaddr;
    int r = getdefaultgateway(&(gatewayaddr.s_addr));
    if(r >= 0) {
        ipString = [NSString stringWithFormat: @"%s",inet_ntoa(gatewayaddr)];
        NSLog(@"default gateway : %@", ipString );
    } else {
        NSLog(@"getdefaultgateway() failed");
    }

    return ipString;
}

当我尝试构建我的项目时出现此错误:

架构 arm64 的 undefined symbol :“getdefaultgateway(unsigned int*)”

这是getgateway.c

int getdefaultgateway(in_addr_t * addr)
{
    int mib[] = {CTL_NET, PF_ROUTE, 0, AF_INET,
        NET_RT_FLAGS, RTF_GATEWAY};
    size_t l;
    char * buf, * p;
    struct rt_msghdr * rt;
    struct sockaddr * sa;
    struct sockaddr * sa_tab[RTAX_MAX];
    int i;
    int r = -1;
    if(sysctl(mib, sizeof(mib)/sizeof(int), 0, &l, 0, 0) < 0) {
        return -1;
    }
    if(l>0) {
        buf = malloc(l);
        if(sysctl(mib, sizeof(mib)/sizeof(int), buf, &l, 0, 0) < 0) {
            return -1;
        }
        for(p=buf; p<buf+l; p+=rt->rtm_msglen) {
            rt = (struct rt_msghdr *)p;
            sa = (struct sockaddr *)(rt + 1);
            for(i=0; i<RTAX_MAX; i++) {
                if(rt->rtm_addrs & (1 << i)) {
                    sa_tab[i] = sa;
                    sa = (struct sockaddr *)((char *)sa + ROUNDUP(sa->sa_len));
                } else {
                    sa_tab[i] = NULL;
                }
            }

            if( ((rt->rtm_addrs & (RTA_DST|RTA_GATEWAY)) == (RTA_DST|RTA_GATEWAY))
               && sa_tab[RTAX_DST]->sa_family == AF_INET
               && sa_tab[RTAX_GATEWAY]->sa_family == AF_INET) {


                if(((struct sockaddr_in *)sa_tab[RTAX_DST])->sin_addr.s_addr == 0) {
                    char ifName[128];
                    if_indextoname(rt->rtm_index,ifName);

                    if(strcmp("en0",ifName)==0){

                        *addr = ((struct sockaddr_in *)(sa_tab[RTAX_GATEWAY]))->sin_addr.s_addr;
                        r = 0;
                    }
                }
            }
        }
        free(buf);
    }
    return r;
}

我需要添加框架吗?我不知道如何让它发挥作用。

最佳答案

是的。 .mm 是我要问你的下一个问题。

You're running into C++ name mangling issues .

在您定义并最终包含/导入 getdefaultgateway 函数的任何 .h 文件中,在之前添加:

#ifdef __cplusplus
extern "C" {
#endif

及之后:

#ifdef __cplusplus
}
#endif

关于ios - 架构 arm64 的 undefined symbol : "getdefaultgateway(unsigned int*)",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38607425/

相关文章:

c - 将成员从struct初始化为外部函数的方向

c++ - 是什么导致此 C 代码中出现段错误?

ios - 如何在另一个函数中调用一个函数?

ios - 播放/暂停下一个/上一个按钮在控制中心显示为灰色

ios - 在 iOS Swift 上从网络加载 MVVM 异步 UIImage

ios - Realm 查询如何工作?

objective-c - 在 UILabel 或 TextView 中显示垂直小数

objective-c - 使用 iOS 8 size class 为 iPad 纵向和横向模式设计不同的 UI

ios - 波形颜色变化的动画图像删除

C .pc 文件警告