Linux下undefined reference to ‘pthread_create’问题解决

Linux下undefined reference to ‘pthread_create’问题解决

在试用Linux 线程模块时,试用pthread_create 函数。
编译命令为 gcc main.c -o test时,会出现如下错误

/usr/bin/ld: /tmp/ccAusWl8.o: in function `main':
05_concurrent_server_thread.c:(.text+0x44c): undefined reference to `pthread_create'
/usr/bin/ld: 05_concurrent_server_thread.c:(.text+0x468): undefined reference to `pthread_detach'
collect2: error: ld returned 1 exit status

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

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

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

gcc main.c -o test -lpthread

如下编译通过 

#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<arpa/inet.h>
#include<netinet/in.h>
#include<unistd.h>
#include <signal.h>
#include <sys/wait.h>
#include <pthread.h>
  
#define N 128

void handler(int sig){
	wait(NULL);
}

typedef struct{
	struct sockaddr_in addr;
	int acceptfd;
}MSG;

void *pthread_fun(void *arg){
	int count = 0;
	ssize_t bytes;
    MSG msg =  *(MSG *)arg;	
	char buf[N] = "666";
	char text[N] = "";
	
	while(1){
		// 打印客户端信息
		printf("ip:%s, port:%d\n", inet_ntoa(msg.addr.sin_addr), ntohs(msg.addr.sin_port));
		
		// 接收数据
		if((count = recv(msg.acceptfd,text,N,0))==-1){
			perror("fail to recv");
			exit(1);
	}else if(count == 0){
		printf("The client quited\n");
		pthread_exit(NULL);
	}
		
		printf("from client: ");
		for(int j=0;j<count;j++){
			printf("%c",text[j]);
		}
		printf("\n");
		
		//发送buf数据
		if(send(msg.acceptfd,buf,sizeof(buf),0)==-1){
			perror("fail to send");
			exit(1);
		}
	}
}

int main(int argc, char const * argv[]){
	
	if(argc < 3){
		fprintf(stderr, "server Usage:%s ip port\n",argv[0]);
		exit(1);
	}
	
	int sockfd;
	
	// 创建tcp套接字
	if((sockfd=socket(AF_INET,SOCK_STREAM,0)) == -1){
		perror("fail to socket");
		exit(1);
	}
	
	struct sockaddr_in serveraddr;
	socklen_t addrlen = sizeof(serveraddr);  
	
	serveraddr.sin_family = AF_INET; // 协议族 AF_INET:ipv4网络协议
	// inet_addr: 将点分十进制字符串ip地址转为整形数据
	serveraddr.sin_addr.s_addr = inet_addr(argv[1]); // ip地址
	// atoi 将数字型字符串转换为整形数据
	// htons 将主机字节序转化为网络字节序
	serveraddr.sin_port = htons(atoi(argv[2]));
	
	// 将套接字和网络信息绑定
	if(bind(sockfd,(struct sockaddr*)&serveraddr, addrlen) == -1){
		perror("fail to connect");
		exit(1);
	};
	
    // 将套接字设置为监听状态
	if(listen(sockfd,5) == -1){
		perror("fail to listen");
		exit(1);
	}
	
	struct sockaddr_in clientsock;
	addrlen = sizeof(clientsock);
	
	
	
	printf("准备阻塞...\n");
	
	// 使用信号,异步的方式处理僵尸进程
	signal(SIGCHLD,handler);
	
	while(1){	
		// 阻塞等待客户端的链接
		int clisock = accept(sockfd,(struct sockaddr*)&clientsock, &addrlen);
		
		// 创建子线程与客户端通信
		MSG msg;
		msg.addr = clientsock;
		msg.acceptfd = clisock;
		pthread_t thread;
		
		if(pthread_create(&thread,NULL,pthread_fun,&msg)!=0){
			perror("fail to pthread_create");
		}
		
		pthread_detach(thread);
		
	}
	
	// 关闭套接字描述符
	//close(clisock);
	//close(sockfd);
	return 0;
}

 

### 回答1: 当在使用gcc编译程序时,出现"undefined reference to pthread_create"的错误信息时,很可能是由于程序中使用了多线程功能,并且没有正确链接pthread库。 解决这个问题的方法是,在编译程序时添加-lpthread选项来链接pthread库。具体步骤如下: 1. 打开终端或命令提示符窗口,进入到源代码所在的目录。 2. 使用gcc编译程序,并加上-lpthread选项,例如: $ gcc source.c -lpthread -o executable 3. 执行上述命令后,重新编译程序,并生成一个可执行文件。 4. 如果编译成功,可执行文件将会生成在当前目录中。 需要注意的是,-lpthread选项必须位于源代码文件名之后,确保正确链接了pthread库。 此外,还有一些特殊情况可能导致该错误的出现,例如: - 没有正确包含pthead.h头文件:需要在源代码文件中添加#include <pthread.h>以引入pthread库的函数声明和定义。 - 编译器或系统缺少pthread库:需要通过安装相应的开发包或更新编译器来解决问题。 总之,gcc undefined reference to pthread_create错误的原因是缺少对pthread库的连接。通过添加-lpthread选项,重新编译程序可以解决问题。 ### 回答2: "undefined reference to `pthread_create'" 是一个编译错误,它通常指的是在编译时缺少了与 `pthread_create` 函数的链接。 这种错误通常是由于以下几个原因引起的: 1. 缺少对 `pthread` 库的链接:在编译程序时,需要使用 `-pthread` 或 `-lpthread` 选项来链接 `pthread` 库。例如,在使用 `gcc` 编译时,可以使用命令 `gcc -pthread main.c -o main` 来链接 `pthread` 库。 2. 未正确包含 `pthread.h` 头文件:如果在程序中使用了 `pthread_create` 函数,那么需要在程序中包含 `pthread.h` 头文件。确保在使用 `pthread_create` 函数之前,包含了正确的头文件。 3. 缺少 POSIX thread 库:`pthread` 是 POSIX 线程库的一部分。因此,如果编译环境不支持 POSIX 线程库,就会出现该错误。在这种情况下,需要检查编译环境是否支持 POSIX 线程库,并使用适当的方法安装。 综上所述,当出现 `gcc undefined reference to pthread_create` 错误时,需要确保正确地链接 `pthread` 库,并正确包含 `pthread.h` 头文件。同时,还要检查编译环境是否支持 POSIX 线程库。 希望以上回答对您有所帮助! ### 回答3: gcc undefined reference to pthread_create是一个常见的错误信息,它表示在使用gcc编译时缺少对pthread_create函数的引用或链接。 pthread_create函数属于POSIX线程库(libpthread),用于创建一个新的线程。当程序中使用了pthread_create函数但未正确引用或链接线程库时,就会出现该错误。 要解决这个问题,我们需要在编译命令中添加对线程库的引用。可以使用"-lpthread"选项来告诉gcc链接线程库。 以下是一个示例的编译命令: gcc -o my_program my_program.c -lpthread 在上面的命令中,"-o my_program"指定了输出文件的名称为"my_program","my_program.c"是需要编译的源代码文件,"-lpthread"告诉gcc链接线程库。 通过在编译命令中添加"-lpthread"选项,就可以解决gcc undefined reference to pthread_create错误。另外,还需要确保系统中已经正确安装了POSIX线程库,否则可能会出现其他问题。 总结一下,要解决gcc undefined reference to pthread_create错误,需要在编译命令中添加对线程库的引用,使用"-lpthread"选项来链接线程库。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值