zoukankan      html  css  js  c++  java
  • Linux下编译出现undefined reference to ‘pthread_create’问题解决

    1.代码

    /* 
     * File:   HeartPackageSendAgent.cpp
     * Author: Pangxiaojian
     *
     *
     * 主要实现:向服务器发送心跳包,每5s向服务器发送一个心跳包
     * File:   HeatPackageAgent.c
     * Author: Pangxiaojian
     *
     */
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <netdb.h>
    #include <net/if.h>
    #include <sys/ioctl.h>
    
    #include <pthread.h>
    #include <unistd.h>
    #define MAXLINE 80
    #define SERV_PORT 8000
    
    const int HeatPort = 6789; //??
    const char ServerIP[255] = "192.168.18.128";
    
    void getIPHost(char** iphost)
    {
         /*
        int sock;
        struct sockaddr_in sin;
        struct ifreq ifr;
      
        sock = socket(AF_INET,SOCK_DGRAM,0);
        int i;
        int j;
        for(i = 0; i<10;i++)
         {
            char* ENAME = (char*)malloc(5*sizeof(char));
          bzero(ENAME,5);//
          sprintf(ENAME,"%s%d",ETH_NAME,i);
          strncpy(ifr.ifr_name,ENAME,IFNAMSIZ);
          free(ENAME);
          ifr.ifr_name[IFNAMSIZ   -   1]   =   0;
    
          if(ioctl(sock,SIOCGIFADDR,&ifr) >= 0)
            goto HERE;
    
              
         }
    
        for(j = 0; j < 10; j++)
        {
            char* WNAME = (char*)malloc(6*sizeof(char));
            bzero(WNAME, 6);
            sprintf(WNAME, "%s%d", WTH_NAME, j);
            strncpy(ifr.ifr_name,   WNAME,   IFNAMSIZ);
            free(WNAME);
            ifr.ifr_name[IFNAMSIZ   -   1]   =   0;
    
            if (ioctl(sock,   SIOCGIFADDR,   &ifr)   >=   0)    
                goto HERE;
        }
    
        */
    
        int inet_sock;
        struct sockaddr_in sin;
        struct ifreq ifr;
        inet_sock = socket(AF_INET,SOCK_DGRAM,0);
        strcpy(ifr.ifr_name,"eth0");
        if(ioctl(inet_sock,SIOCGIFADDR,&ifr)>=0)
         {
          perror("ioctl");
            printf("%s
    ",inet_ntoa(((struct sockaddr_in*)&(ifr.ifr_addr))->sin_addr));
            goto HERE;
         }
    
    HERE:
        memcpy(&sin,&ifr.ifr_addr,sizeof(sin));
        char* hostname = (char*)malloc(256*sizeof(char));
        bzero(hostname, 256);
        gethostname(hostname, 256*sizeof(char));
        char* ip = inet_ntoa(sin.sin_addr);
        int lenhost  = strlen(hostname);
        int lenip = strlen(ip);
        *iphost = (char*)malloc((lenhost+lenip+2)*sizeof(char));
        bzero(*iphost, (lenhost+lenip+2)*sizeof(char));
        sprintf(*iphost,   "%s:%s",  ip, hostname);
         free(hostname);
    
    }
    
    
    int heart_send()
    {
        char send_buf[MAXLINE];
        char recv_buf[MAXLINE];
        char *iphost = NULL;
        int sockfd = socket(AF_INET, SOCK_DGRAM, 0);
    
        struct sockaddr_in cliaddr;//host 
        cliaddr.sin_family = AF_INET;
        cliaddr.sin_addr.s_addr = inet_addr(ServerIP);//host ip
        cliaddr.sin_port = htons(SERV_PORT);
    
        bind(sockfd, (struct sockaddr *)&cliaddr, sizeof(cliaddr));
    
        getIPHost(&iphost); 
    
        memcpy(send_buf,iphost,strlen(iphost));//heart packet
    
        while (1)
        {
            struct sockaddr_in servaddr;
            socklen_t servaddr_len = sizeof(servaddr);
    
            int count = recvfrom(sockfd, recv_buf, MAXLINE, 0, (struct sockaddr *)&servaddr, &servaddr_len);
        
            if (count < 0)
                {
                printf("recvfrom error");
                continue;
                }
           printf("received msg is %s
    ",recv_buf);
           sendto(sockfd, send_buf, sizeof(send_buf), 0, (struct sockaddr *)&servaddr, sizeof(servaddr));
           sleep(5);
    
        }
        close(sockfd);
          //return ((void*)l);
        
    }
    
    
    int main()
    {
        pthread_t m_threadHeartSend;
        int *ret_join = NULL;
        if (pthread_create(&m_threadHeartSend, NULL, &heart_send, NULL) != 0)
            return -1;
        pthread_join(m_threadHeartSend,(void*)&ret_join);
    
    
    }

    2.编译命令为 gcc main.c -o test时,会出现如下错误

    /tmp/ccCuKQ9a.o: In function `main':
    client2_test.c:(.text+0x2ec): undefined reference to `pthread_create'
    client2_test.c:(.text+0x30e): undefined reference to `pthread_join'
    collect2: ld 返回 1

    3.原因和解决方法

    问题的原因:pthread不是linux下的默认的库,也就是在链接的时候,无法找到phread库中哥函数的入口地址,于是链接会失败。

    解决:在gcc编译的时候,附加要加 -lpthread参数即可解决。

    试用如下命令即可编译通过

    gcc main.c -o test -lpthread

    4.参考链接

    https://www.cnblogs.com/langzou/p/7364014.html
  • 相关阅读:
    【xinsir】githook之precommit分享
    node进程一些信号的意义
    ES6篇
    Webpack4篇
    Node篇
    Vuex篇
    WebStorage篇
    HTML5篇
    html5语义化标签大全
    emmet语法
  • 原文地址:https://www.cnblogs.com/developmental-t-xxg/p/9947113.html
Copyright © 2011-2022 走看看