2016-07-27 8 views
0

接続先のWiFiのゲートウェイIPアドレスを取得しようとしています。このquestionの回答を使用していますが、コードにエラーが発生しています。アーキテクチャarm64の未定義のシンボル: "getdefaultgateway(unsigned int *)"

私は私のプロジェクトで

- (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; 
} 

をこれを使用すると、私は私のプロジェクトをビルドしようとすると、私はこのエラーを取得する:ここで

Undefined symbols for architecture arm64: "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; 
} 

ですフレームワークを追加する必要はありますか?私はそれを動作させる方法を知らない。

+1

おそらくかどうかを確認する必要があり、ユーザーが定義し、最終的に/、getdefaultgateway機能をインポートする前にこれを追加含ま方.hファイルで

。 cファイルはXcodeによってコンパイルされています。ガベージコードを 'getdefaultgateway'関数に入れると、Xcodeはコンパイルをやめてそこにエラーを投げますか? –

+0

うん、私はちょうどそれをチェックし、.cはコンパイルされる。多分、私のクラスで.mmの拡張子を持つ何かをしなければならないのでしょうか?私のクラスが自動鋳造を受け入れない時には、以前は問題がありました。 – theFool

答えて

1

はい。 .mmが私の次の質問でした。

You're running into C++ name mangling issues

#ifdef __cplusplus 
extern "C" { 
#endif 

と後:

#ifdef __cplusplus 
} 
#endif 
+0

それは素晴らしい仲間です!あなたはどこでそれを学びましたか?私は、キャスティングなどの作業をするために考えているコードを追加しようとしましたが、おそらくそれを考えることはできませんでした。ハイタッチ! – theFool

関連する問題