undefined reference to `sem_init'

198 views
Skip to first unread message

wiliam

unread,
Mar 23, 2009, 3:17:16 AM3/23/09
to 西邮Linux兴趣小组
今天替朋友写了一个生产者消费者作业,但出现下面的问题,请各位看一下。
comsumer.c:(.text+0x10): undefined reference to `sem_wait'
comsumer.c:(.text+0x1c): undefined reference to `sem_wait'
comsumer.c:(.text+0x69): undefined reference to `sem_post'
comsumer.c:(.text+0x75): undefined reference to `sem_post'
/tmp/ccI4QZLp.o: In function `productor':
comsumer.c:(.text+0xa3): undefined reference to `sem_wait'
comsumer.c:(.text+0xaf): undefined reference to `sem_wait'
comsumer.c:(.text+0xf6): undefined reference to `sem_post'
comsumer.c:(.text+0x102): undefined reference to `sem_post'
/tmp/ccI4QZLp.o: In function `main':
comsumer.c:(.text+0x1ac): undefined reference to `sem_init'
comsumer.c:(.text+0x1c8): undefined reference to `sem_init'
comsumer.c:(.text+0x1e4): undefined reference to `sem_init'
comsumer.c:(.text+0x236): undefined reference to `pthread_create'
comsumer.c:(.text+0x27f): undefined reference to `pthread_create'
comsumer.c:(.text+0x2b9): undefined reference to `pthread_join'
comsumer.c:(.text+0x2cc): undefined reference to `pthread_join'
comsumer.c:(.text+0x2df): undefined reference to `pthread_join'
comsumer.c:(.text+0x2f2): undefined reference to `pthread_join'
collect2: ld returned 1 exit status
代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <sys/ipc.h>
#include <unistd.h>
#include <sys/types.h>
#include <errno.h>
#include <unistd.h>
#include <fcntl.h>
#include <pthread.h>
#include <semaphore.h>
#include <sys/stat.h>
#define FIFO "myfifo"
#define N 5
sem_t mutex,avail,full;
int fd;
time_t end_time;
char buf[100];
int lock_var;
//两个生产者线程和两个消费者线程
void productor(void *arg);
void consumer(void *arg);
int main(int argc,char *argv[]){
pthread_t id[4];
int i;
pthread_attr_t attr;
end_time=time(NULL)+30;

if((mkfifo(FIFO,O_CREAT|O_EXCL))<0){
perror("mkfifo");
exit(-1);
}
fd=open(FIFO,O_RDWR|O_NONBLOCK,0);
sem_init(&mutex,0,1);
sem_init(&avail,0,N);
sem_init(&full,0,0);

pthread_attr_init(&attr);
pthread_attr_setscope(&attr,PTHREAD_SCOPE_SYSTEM);
pthread_attr_setscope(&attr,PTHREAD_CREATE_DETACHED);

for(i=0;i<2;i++)
if(pthread_create(&id[i],&attr,(void *)productor,NULL)<0){
perror("pthread_create");
exit(-2);
}
while(i<4){
if(pthread_create(&id[i],&attr,(void *)consumer,NULL)<0){
perror("pthread_create");
exit(-2);
}
i++;
}
pthread_join(id[0],NULL);
pthread_join(id[1],NULL);
pthread_join(id[2],NULL);
pthread_join(id[3],NULL);
return(0);
}

void productor(void *arg){
int n;
while(time(NULL)<end_time){
sem_wait(&avail);
sem_wait(&mutex);
if((n=write(fd,"hello",5))<0)
perror("write");
else
printf("write hello to the FIFO\n");
sem_post(&full);
sem_post(&mutex);
}
}

void consumer(void *arg){
int n;
while(time(NULL)<end_time){
sem_wait(&avail);
sem_wait(&mutex);

if((n=read(fd,buf,100))<0)
perror("read");
printf("read from the FIFO:%s\n",buf);
sem_post(&full);
sem_post(&mutex);
sem_post(&mutex);
}
}

Kermit Mei

unread,
Mar 23, 2009, 3:31:29 AM3/23/09
to wiliam, 西邮Linux兴趣小组
On Mon, 2009-03-23 at 00:17 -0700, wiliam wrote:
> 今天替朋友写了一个生产者消费者作业,但出现下面的问题,请各位看一下。
> comsumer.c:(.text+0x10): undefined reference to `sem_wait'
> comsumer.c:(.text+0x1c): undefined reference to `sem_wait'
> comsumer.c:(.text+0x69): undefined reference to `sem_post'
> comsumer.c:(.text+0x75): undefined reference to `sem_post'
> /tmp/ccI4QZLp.o: In function `productor':
> comsumer.c:(.text+0xa3): undefined reference to `sem_wait'
> comsumer.c:(.text+0xaf): undefined reference to `sem_wait'
> comsumer.c:(.text+0xf6): undefined reference to `sem_post'
> comsumer.c:(.text+0x102): undefined reference to `sem_post'
> /tmp/ccI4QZLp.o: In function `main':
> comsumer.c:(.text+0x1ac): undefined reference to `sem_init'
> comsumer.c:(.text+0x1c8): undefined reference to `sem_init'
> comsumer.c:(.text+0x1e4): undefined reference to `sem_init'
> comsumer.c:(.text+0x236): undefined reference to `pthread_create'
> comsumer.c:(.text+0x27f): undefined reference to `pthread_create'
> comsumer.c:(.text+0x2b9): undefined reference to `pthread_join'
> comsumer.c:(.text+0x2cc): undefined reference to `pthread_join'
> comsumer.c:(.text+0x2df): undefined reference to `pthread_join'
> comsumer.c:(.text+0x2f2): undefined reference to `pthread_join'
没有链接到libpthread上,编译的时候在后面加个选项: -lpthread

<snip>

wiliam

unread,
Mar 23, 2009, 6:36:33 AM3/23/09
to 西邮Linux兴趣小组

On 3月23日, 下午3时31分, Kermit Mei <kermit....@gmail.com> wrote:

> 没有链接到libpthread上,编译的时候在后面加个选项: -lpthread
>
> <snip>
我加了#include <pthread.h>,怎么还要-lpthread?

Kermit Mei

unread,
Mar 23, 2009, 6:41:51 AM3/23/09
to wiliam, 西邮Linux兴趣小组

#include <pthread.h> 是包含头文件,这些头文件中一般只有你所调用的还书的
声明,而这些函数的定义已经被编译成可执行代码被存放到libpthread.so中了,
因此你必须在编译时告诉编译器连接到这个库上。

默认情况下,编译器会自动把程序链接的标准库上,如libstdc,但其他的库需要
程序员在编译时手动连接,-lpthread告诉链接器连接到libpthread.so上。

Reply all
Reply to author
Forward
0 new messages