Linux에서 pthread_create에 대한 정의되지 않은 참조


376

https://computing.llnl.gov/tutorials/pthreads/ 에서 웹에서 다음 데모를 선택했습니다.

#include <pthread.h>
#include <stdio.h>
#define NUM_THREADS     5

void *PrintHello(void *threadid)
{
   long tid;
   tid = (long)threadid;
   printf("Hello World! It's me, thread #%ld!\n", tid);
   pthread_exit(NULL);
}

int main (int argc, char *argv[])
{
   pthread_t threads[NUM_THREADS];
   int rc;
   long t;
   for(t=0; t<NUM_THREADS; t++){
      printf("In main: creating thread %ld\n", t);
      rc = pthread_create(&threads[t], NULL, PrintHello, (void *)t);
      if (rc){
         printf("ERROR; return code from pthread_create() is %d\n", rc);
         exit(-1);
      }
   }
   pthread_exit(NULL);
}

그러나 내 컴퓨터에서 컴파일하면 (Ubuntu Linux 9.04 실행) 다음 오류가 발생합니다.

corey@ubuntu:~/demo$ gcc -o term term.c
term.c: In function main’:
term.c:23: warning: incompatible implicit declaration of built-in function exit
/tmp/cc8BMzwx.o: In function `main':
term.c:(.text+0x82): undefined reference to `pthread_create'
collect2: ld returned 1 exit status

헤더에는 기능 pthread.h이 있어야하는을 포함하기 때문에 나에게 의미가 없습니다 pthread_create. 무슨 일이 일어나고 있는지 어떤 아이디어?


6
또한 : 플랫폼에 따라, 당신은 스레드 (A) 다른 컴파일러, (b)는 스레드에 대해 다른 libc의 (즉해야 할 수도 있습니다 -lc_r), (C) -thread또는 -threads대신 또는 이외에, 또는 다른 -lpthread.
ephemient

이 예제보다 조금 위에는 GCC, IBM 등 올바른 컴파일러 명령 표가 표시됩니다. 'Employed Russian'이 정확합니다.
Jonathon Reinhart

8
내 답변의 표시를 해제하여 삭제할 수 있도록 할 수 있습니까 (실제로 올바른 답변, 가장 높은 투표 인 답변을 표시)?
Pavel Minaev

3
-lpthread컴파일하는 동안 필요
어떻게 Chen

5
해결책LDFLAGS= -pthread -lpthread
dsnk

답변:


696

지금까지이 질문에 대한 대답은 모두 틀립니다 .
Linux의 경우 올바른 명령은 다음과 같습니다.

gcc -pthread -o term term.c

일반적으로 라이브러리는 명령 행에서 소스 및 오브젝트를 따라야 -lpthread하며 "옵션"이 아니며 라이브러리 스펙입니다. libpthread.a설치된 시스템에서만

gcc -lpthread ...

연결되지 않습니다.


2
+1이 솔루션은 효과가 있었지만 다른 사람들은 그렇지 않았습니다. 또한 '라이브러리가 소스와 객체를 따라야한다'는 제안은 훌륭한 조언입니다. 인용이나 추가 설명이 좋을 것입니다.
sholsapp 2012 년

7
@sholsapp 여기에 설명이 있습니다 : webpages.charter.net/ppluzhnikov/linker.html
러시아어로 고용

명령의 맨 끝에 -lpthread를 넣을 때까지 여전히 오류가 발생했습니다. gcc term.c -lpthread
CornSmith

방금 libpthread.a와 libpthread.so가 모두있는 Ubuntu 14.04에서 snortsam 을 컴파일하는 문제가 발생했습니다 . 내가지고 있다고 undefined reference to 'pthread_cancel'undefined reference to 'pthread_create'오류. 나는이 SO 포스트를 보았고 Employed Russian의 대답을 시험해 볼 것이라고 생각했습니다. makesnortsam.shVI에서 열어서 컴파일 할 때 대신 :%s/lpthread/pthread/g사용할 수 있도록 lpthread를 pthread로 바꾸라 는 명령 을 실행했습니다 . 그런 다음 코 고는 소리를 컴파일 할 수있었습니다. 러시아어 고용 감사합니다! -pthread-lpthread
dcarrith

5
CODEBLOCKS를 사용하는 사람 : -pthread프로젝트 빌드 옵션에 추가 -> 링커 설정-> 기타 링커 옵션.
user3728501

39

일식으로

속성-> c / c ++ 빌드-> 설정-> GCC C ++ 링커-> 상단의 라이브러리에 "pthread"추가


같은 팁 코드 : 프로젝트에 applyes (그리고 나는 다른 사람들이 너무 IDE 생각)

19

Linux 터미널에서 실행하면 다음 명령을 사용하여 컴파일했습니다 (컴파일하려는 c 파일을 test.c라고 함).

gcc -o test test.c -pthread

그것이 누군가를 돕기를 바랍니다!


19

Linux의 경우 올바른 명령은 다음과 같습니다.

gcc -o term term.c -lpthread
  1. 컴파일 명령 바로 뒤에 -lpthread를 넣어야합니다.이 명령은 pthread.h 라이브러리로 프로그램을 실행하도록 컴파일러에 지시합니다.
  2. gcc -l은 라이브러리 파일과 연결합니다 .lib 접두사가없는 라이브러리 이름과 -l을 연결하십시오.

플랫폼에서 동일한 기능을 가진 표준 플래그가 존재하는 경우 비표준 플래그를 사용하는 것은 좋지 않습니다.
David Schwartz


12

cmake를 사용하는 경우 다음을 사용할 수 있습니다.

add_compile_options(-pthread)

또는

SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pthread")

7

다음과 같이 컴파일하십시오 : gcc demo.c -o demo -pthread


6

내가 추가 할 수있는 적절한 방법 생각 pthread으로는 CMake다음과 함께

find_package (Threads REQUIRED)

target_link_libraries(helloworld
    ${CMAKE_THREAD_LIBS_INIT}
)

4

Visual Studio 2019 -pthread에서 프로젝트의 속성 페이지에서 다음을 지정 하십시오.

링커-> 명령 줄-> 추가 옵션

에서 입력 -pthread텍스트 상자에.


3

-lpthreadgcc와 함께 옵션을 사용해야합니다 .


7
잘못된 정보! -lpthread"옵션"이 아니며 라이브러리를 지정합니다.

(명령 행 인수는 대조적으로) 명령 줄 옵션
알렉산더 Stohr

3

proprieties => C / C ++ build => GCC C ++ Linker => Libraries => 상단 부분 "Libraries (-l)"에 "pthread"만 추가하면됩니다. 그게 다야


2

맨 페이지를 확인하면 얻을 수 있습니다.

-pthread로 컴파일하고 링크하십시오.

SYNOPSIS
       #include <pthread.h>

       int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
                          void *(*start_routine) (void *), void *arg);


       Compile and link with -pthread.
       ....

0

Anjuta에서 빌드 메뉴로 이동 한 다음 프로젝트 구성으로 이동하십시오. 구성 옵션 상자에서 다음을 추가하십시오.

LDFLAGS='-lpthread'

누군가에게도 도움이되기를 바랍니다 ...


0

여러 라이브러리를 사용하는 경우 라이브러리 종속성을 확인하십시오. (예 : -lpthread -lSDL ... <==> ... -lSDL -lpthread)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.