Tham chiếu không xác định đến pthread_create trong Linux


376

Tôi đã chọn bản demo sau trên web từ 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);
}

Nhưng khi tôi biên dịch nó trên máy của mình (chạy Ubuntu Linux 9.04), tôi gặp lỗi sau:

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

Điều này không có ý nghĩa gì với tôi, bởi vì tiêu đề bao gồm pthread.h, nên có pthread_createchức năng. Bất cứ ý tưởng những gì đang đi sai?


6
Ngoài ra: tùy thuộc vào nền tảng này, bạn có thể cần (a) một trình biên dịch khác nhau cho chủ đề, (b) một libc khác nhau cho chủ đề (ví dụ -lc_r), (c) -threadhoặc -threadshoặc khác, thay vì hay ngoài -lpthread.
ephemient

Chỉ cần một chút ở trên ví dụ đó, bạn sẽ thấy một bảng các lệnh của trình biên dịch chính xác, cho dù đó là GCC, IBM, v.v. "Tiếng Nga có việc làm" là chính xác.
Jonathon Reinhart

8
Bạn có thể vui lòng bỏ đánh dấu câu trả lời của tôi để tôi có thể xóa nó (và đánh dấu câu trả lời đúng, đây là câu được bình chọn cao nhất)?
Pavel Minaev

3
-lpthreadlà cần thiết trong quá trình biên dịch
Cách Chen

5
giải phápLDFLAGS= -pthread -lpthread
DSNk

Câu trả lời:


696

Cả hai câu trả lời cho câu hỏi này cho đến nay đều không chính xác .
Đối với Linux, lệnh chính xác là:

gcc -pthread -o term term.c

Nói chung, các thư viện nên theo các nguồn và đối tượng trên dòng lệnh và -lpthreadkhông phải là "tùy chọn", đó là một đặc tả thư viện. Trên một hệ thống chỉ libpthread.ađược cài đặt,

gcc -lpthread ...

sẽ không liên kết.


2
+1 giải pháp này đã làm việc ... những người khác thì không. Ngoài ra, đề xuất rằng 'thư viện nên theo nguồn và đối tượng' là lời khuyên tuyệt vời - một trích dẫn hoặc giải thích thêm sẽ rất tuyệt.
sholsapp

7
@sholsapp Đây là lời giải thích: webpages.charter.net/ppluzhnikov/linker.html
Sử dụng tiếng Nga

Điều này vẫn còn sai đối với tôi cho đến khi tôi đặt -lpthread vào cuối lệnh của tôi. gcc term.c -lpthread
CornSmith

Tôi vừa gặp phải một vấn đề biên dịch snortsam trên Ubuntu 14.04 thực sự có cả libpthread.a và libpthread.so. Tôi đã nhận được undefined reference to 'pthread_cancel'undefined reference to 'pthread_create'lỗi. Tôi đã xem qua bài viết SO này và nghĩ rằng tôi sẽ thử câu trả lời của Nga. Tôi đã mở makesnortsam.shtrong VI và chạy lệnh :%s/lpthread/pthread/gthay thế lpthread bằng pthread để nó sẽ sử dụng -pthreadthay vì -lpthreadkhi biên dịch. Sau đó tôi đã có thể biên dịch snortsam. Cảm ơn việc làm Nga!
dcarrith

5
Đối với bất kỳ ai sử dụng CODEBLOCKS: Thêm vào -pthreadTùy chọn xây dựng dự án -> Cài đặt trình liên kết -> Tùy chọn liên kết khác.
dùng3728501

39

trong nhật thực

thuộc tính-> c / c ++ Build-> settings-> GCC C ++ linker-> thư viện trong phần trên cùng thêm "pthread"


Cùng một mẹo áp dụng trong mã :: dự án (và tôi nghĩ IDE khác cũng vậy)
Fil

19

Chạy từ thiết bị đầu cuối Linux, những gì làm việc cho tôi là biên dịch bằng lệnh sau (giả sử tệp c tôi muốn biên dịch được gọi là test.c):

gcc -o test test.c -pthread

Hy vọng nó sẽ giúp được ai đó!


19

Đối với Linux, lệnh chính xác là:

gcc -o term term.c -lpthread
  1. bạn phải đặt -lpthread ngay sau lệnh biên dịch, lệnh này sẽ báo cho trình biên dịch thực thi chương trình với thư viện pthread.h.
  2. gcc -l liên kết với một tệp thư viện. Nháy -l với tên thư viện không có tiền tố lib.

Không nên sử dụng cờ không chuẩn khi tồn tại cờ tiêu chuẩn có cùng chức năng trên nền tảng của bạn.
David Schwartz


12

Nếu bạn đang sử dụng cmake, bạn có thể sử dụng:

add_compile_options(-pthread)

Hoặc là

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


6

Tôi tin rằng con đường đúng đắn của việc thêm pthreadvào CMakelà với những điều sau đây

find_package (Threads REQUIRED)

target_link_libraries(helloworld
    ${CMAKE_THREAD_LIBS_INIT}
)

4

Trong Visual Studio 2019 chỉ định -pthreadtrong các trang thuộc tính cho dự án bên dưới:

Trình liên kết -> Dòng lệnh -> Tùy chọn bổ sung

Nhập vào -pthreadhộp văn bản.


3

Bạn cần sử dụng tùy chọn -lpthreadvới gcc.


7
thông tin sai! -lpthreadkhông phải là một "tùy chọn", nó chỉ định một thư viện.

một tùy chọn dòng lệnh (trái ngược với đối số dòng lệnh)
Alexander Stohr

3

bạn chỉ cần thêm "pthread" trong quyền sở hữu => C / C ++ build => GCC C ++ Linker => Thư viện => phần trên cùng "Thư viện (-l)". đó là nó


2

kiểm tra trang người đàn ông và bạn sẽ nhận được.

Biên dịch và liên kết với -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

Trong Anjuta, đi tới trình đơn Xây dựng, sau đó Định cấu hình Dự án. Trong hộp Cấu hình Tùy chọn, thêm:

LDFLAGS='-lpthread'

Hy vọng nó cũng sẽ giúp được ai đó ...


0

Đôi khi, nếu bạn sử dụng nhiều thư viện, hãy kiểm tra phụ thuộc thư viện. (ví dụ: -lpthread -lSDL ... <==> ... -lSDL -lpthread)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.