• 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
  • 相关阅读:
    Linux 下的类似Windows下Everything的搜索工具
    windows和linux环境下制作U盘启动盘
    程序调试手段之gdb, vxworks shell
    LeetCode 1021. Remove Outermost Parentheses (删除最外层的括号)
    LeetCode 1047. Remove All Adjacent Duplicates In String (删除字符串中的所有相邻重复项)
    LeetCode 844. Backspace String Compare (比较含退格的字符串)
    LeetCode 860. Lemonade Change (柠檬水找零)
    LeetCode 1221. Split a String in Balanced Strings (分割平衡字符串)
    LeetCode 1046. Last Stone Weight (最后一块石头的重量 )
    LeetCode 746. Min Cost Climbing Stairs (使用最小花费爬楼梯)
  • 原文地址:https://www.cnblogs.com/developmental-t-xxg/p/9947113.html
Copyright © 2020-2023  润新知