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\n",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\n",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
posted @ 2018-11-12 16:13  小刚的视界  阅读(1928)  评论(0编辑  收藏  举报