new to emcc, who knows hot to solve the problems: error 'linux/if_link.h' file not found or warning:unresolved symbol: htons

283 views
Skip to first unread message

zhatian diao

unread,
May 9, 2018, 9:28:56 AM5/9/18
to emscripten-discuss
    Hello everyone , I m new to emcc.
   
    Today I followed the user guide to install emcc and run the hello world example successfully.

    However, things went wrong when I tried to compile another c file to js file.   

    At first, I got an error 

       testfiles/getip.c:10:17: fatal error: 'linux/if_link.h' file not found
       #include <linux/if_link.h>
                ^~~~~~~~~~~~~~~~~
      1 error generated.
      ERROR:root:compiler frontend failed to generate LLVM bitcode, halting

    The strange thing is that I compiled the c file early with gcc without error. It can be run successfully.

    So I changed my code and removed "<linux/if_link.h>". I got another compile warning:  warning:unresolved symbol: htons. 

    It s source c code can also be compiled with gcc.

    Is there anything I missed or unconfigured?




    Compile enviroment : ubuntu

    head include: 

       #include <arpa/inet.h>
       #include <sys/socket.h>
       #include <netdb.h>
       #include <ifaddrs.h>
       #include <stdio.h>
       #include <stdlib.h>
       #include <unistd.h>
       #include <string.h>
       #include <linux/if_link.h>

Brion Vibber

unread,
May 9, 2018, 12:00:00 PM5/9/18
to emscripten Mailing List
On Wed, May 9, 2018, 6:28 AM zhatian diao <x25836...@gmail.com> wrote:
    Hello everyone , I m new to emcc.
   
    Today I followed the user guide to install emcc and run the hello world example successfully.

Welcome! :)
 
    However, things went wrong when I tried to compile another c file to js file.   

    At first, I got an error 

       testfiles/getip.c:10:17: fatal error: 'linux/if_link.h' file not found
       #include <linux/if_link.h>
                ^~~~~~~~~~~~~~~~~
      1 error generated.
      ERROR:root:compiler frontend failed to generate LLVM bitcode, halting

    The strange thing is that I compiled the c file early with gcc without error. It can be run successfully.

emscripten is not Linux, and does not include Linux-specific kernel interfaces. Think of it as cross-compiling to another operating system... If your source code needs linux/if_link.h for Linux-specific code, it will need to be modified to build for emscripten.

Note that the networking support in emscripten is limited because the web runtime limited what is possible; you can't look up IP addresses or connect to arbitrary hosts or ports. Make sure your test program is something that would actually work.
 
    So I changed my code and removed "<linux/if_link.h>". I got another compile warning:  warning:unresolved symbol: htons. 

    It s source c code can also be compiled with gcc.

    Is there anything I missed or unconfigured?




    Compile enviroment : ubuntu

    head include: 

       #include <arpa/inet.h>
       #include <sys/socket.h>
       #include <netdb.h>
       #include <ifaddrs.h>
       #include <stdio.h>
       #include <stdlib.h>
       #include <unistd.h>
       #include <string.h>
       #include <linux/if_link.h>

htons is defined in arpa/inet.h which you're also including, so it should work. Can you provide a minimal test case? (Small complete .c file that can be compiled, and the command-line flags you're using to compile it)
 
-- brion

zhatian diao

unread,
May 9, 2018, 9:34:16 PM5/9/18
to emscripten-discuss
thanks for your reply!

Here is the c source code:

---------------------------------------------

#include <arpa/inet.h>
#include <sys/socket.h>
#include <netdb.h>
#include <ifaddrs.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>

char * myFunction ();

int main(int argc, char *argv[])
{
        char *str = myFunction();
        printf("%s\n", str);
        return 0;

}

char * myFunction () {

         char *sub_str = malloc(1100 * sizeof(char));
        //char* sub_str = new char[100];
        char *split = ":";
        char *end = ";";
        struct ifaddrs *ifaddr, *ifa;
        int family, s;
        int x=0;
        char host[NI_MAXHOST];

        if (getifaddrs(&ifaddr) == -1)
        {
                perror("getifaddrs");
                exit(EXIT_FAILURE);
        }


        for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next)
        {
                if (ifa->ifa_addr == NULL)
                        continue;

                s=getnameinfo(ifa->ifa_addr,sizeof(struct sockaddr_in),host, NI_MAXHOST, NULL, 0, NI_NUMERICHOST);

                if(ifa->ifa_addr->sa_family==AF_INET)
                {
                        if (s != 0)
                        {
                                printf("getnameinfo() failed: %s\n", gai_strerror(s));
                                exit(EXIT_FAILURE);
                        }
                        if(x==0){
                                strcpy(sub_str, ifa->ifa_name);
                                strcat(sub_str, split);
                                strcat(sub_str, host);
                                strcat(sub_str, end);
                        }else{
                                strcat(sub_str, ifa->ifa_name);
                                strcat(sub_str, split);
                                strcat(sub_str, host);
                                strcat(sub_str, end);

                        }
                        x++;
                }
        }

        int len = strlen(sub_str);
        sub_str[len - 1] = '\0';
        freeifaddrs(ifaddr);
        return sub_str;

}


---------------------------------------------------

and the command-line flags is  gcc -o getip getip.c

zhatian diao

unread,
May 9, 2018, 11:31:26 PM5/9/18
to emscripten-discuss
By the way,  the emcc compile command  is emcc -g getip.c -o getip.js.   The emcc version is newest because I just installed it yesterday.
Reply all
Reply to author
Forward
0 new messages