gcc는 pthread에 연결할 수 없습니까?


17

최근에 XUbuntu 11.10 64bit를 설치했지만 가장 간단한 pthread 예제를 컴파일하는 데 문제가 있습니다.

코드는 다음과 같습니다 pthread_simple.c.

#include <stdio.h>
#include <pthread.h> 
main()  {
  pthread_t f2_thread, f1_thread; 
  void *f2(), *f1();
  int i1,i2;
  i1 = 1;
  i2 = 2;
  pthread_create(&f1_thread,NULL,f1,&i1);
  pthread_create(&f2_thread,NULL,f2,&i2);
  pthread_join(f1_thread,NULL);
  pthread_join(f2_thread,NULL);
}
void *f1(int *x){
  int i;
  i = *x;
  sleep(1);
  printf("f1: %d",i);
  pthread_exit(0); 
}
void *f2(int *x){
  int i;
  i = *x;
  sleep(1);
  printf("f2: %d",i);
  pthread_exit(0); 
}

그리고 여기 컴파일 명령이 있습니다

gcc -lpthread pthread_simple.c

결과 :

lptang @ tlp-linux : ~ / test / test-pthread $ gcc -lpthread pthread_simple.c 
/tmp/ccmV0LdM.o :`main '함수에서 :
pthread_simple.c :(. text + 0x2c) :`pthread_create '에 대한 정의되지 않은 참조
pthread_simple.c :(. text + 0x46) :`pthread_create '에 대한 정의되지 않은 참조
pthread_simple.c :(. text + 0x57) :`pthread_join '에 대한 정의되지 않은 참조
pthread_simple.c :(. text + 0x68) :`pthread_join '에 대한 정의되지 않은 참조
collect2 : ld가 1 개의 종료 상태를 리턴했습니다.

누구든지 문제의 원인을 알고 있습니까?


처음 두 줄에 빈 포함이있는 것은 stackexchange의 결함입니까? 13시 24 분에#include <pthread.h>
Frg

예, 사전 환경을 사용했습니다. 이제 올바르게 표시됩니다.
chtlp


BTW,로 컴파일하십시오 -Wall. 헤더가 없습니다. (그리고 sr_는 맞습니다.)
Mat

답변:


26

최신 버전의 gcc컴파일러에서는 라이브러리가 객체 또는 소스 파일을 따라야합니다.

따라서 이것을 컴파일하려면 다음과 같아야합니다.

gcc pthread_sample.c -lpthread

일반적으로 pthread 코드는 다음과 같이 컴파일됩니다.

gcc -pthread pthread_sample.c

1
@Karlson 왜 pthread.h파일을 포함하는 것만으로 gcc가 참조를 해결하기에 충분하지 않은지 설명해 주 시겠습니까?
Quazi Irfan

2
@iamcreasy 선언은 정의와 같지 않기 때문에. 프로그램은 특정 기능을 실행하는 코드가 어디에 있는지 알아야합니다.
Karlson


0

다음 명령을 사용하여 코드 컴파일

gcc filename.c -lpthread -lrt

1
안녕하세요! 답을 편집하여 왜 효과가 있는지 설명하고 이미 수락 된 답변에서 다루지 않는 내용을 추가하는 이유를 강조 할 수 있다면 도움이 될 것입니다.
dhag
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.