在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
另外:根据不同的平台上,你可能需要(一)线程不同的编译器,(b)在不同的libc线程(即-lc_r),(C)-thread-threads或其他替代或补充-lpthread
短暂

在该示例的上方,您将看到一张正确的编译器命令表,无论它是GCC,IBM等。“ Employed Russian”是正确的。
乔纳森·莱因哈特

8
您能否取消我的答案标记,以便我可以将其删除(并标记实际上正确的答案,即投票最高的答案)?
帕维尔·米纳夫

3
-lpthread在编译过程中需要
Chen Chen

5
解决方案LDFLAGS= -pthread -lpthread
dsnk

Answers:


695

到目前为止,这个问题的两个答案都是错误的
对于Linux,正确的命令是:

gcc -pthread -o term term.c

通常,库应遵循命令行中的源和对象,而-lpthread不是“选项”,它是库规范。在仅libpthread.a安装的系统上,

gcc -lpthread ...

将无法链接。


2
+1此解决方案有效……其他人则没有。另外,建议“图书馆应该遵循资源和对象”是很好的建议-引用或进一步解释将是很好的。
sholsapp


在我将-lpthread放在命令末尾之前,这仍然对我来说是错误的。gcc term.c -lpthread
CornSmith

我刚遇到在Ubuntu 14.04上编译snortsam的问题,实际上它同时具有libpthread.a和libpthread.so。我正在undefined reference to 'pthread_cancel'undefined reference to 'pthread_create'错误。我遇到了这个SO帖子,以为我会尝试Employed Russian的答案。我打开了makesnortsam.sh第六和运行的命令:%s/lpthread/pthread/g与并行线程来代替lpthread这样它会使用-pthread,而不是-lpthread在编译时。这样我就可以编译snortsam。谢谢用俄文!
dcarrith 2014年

5
对于使用CODEBLOCKS的任何人:添加-pthread到项目构建选项->链接器设置->其他链接器选项。
user3728501 2015年

39

日食

属性-> c / c ++ Build->设置-> GCC C ++链接器->顶部的库中添加“ pthread”


同样的提示在代码::项目applyes(我认为其他IDE太)
费尔


19

对于Linux,正确的命令是:

gcc -o term term.c -lpthread
  1. 您必须在编译命令之后放置-lpthread,该命令将告诉编译器使用pthread.h库执行程序。
  2. gcc -l链接到库文件,链接-l的库名不带lib前缀。

当存在与平台具有相同功能的标准标志时,使用非标准标志不是一个好主意。
戴维·史瓦兹


12

如果您使用的是cmake,则可以使用:

add_compile_options(-pthread)

要么

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


6

我相信,加入适当的方式pthreadCMake与以下

find_package (Threads REQUIRED)

target_link_libraries(helloworld
    ${CMAKE_THREAD_LIBS_INIT}
)

4

在Visual Studio 2019 -pthread中,在以下项目的属性页中指定:

链接器->命令行->其他选项

键入-pthread在文本框中。


3

您需要在-lpthreadgcc中使用该选项。


7
错误的信息!-lpthread不是“选项”,它指定一个库。

命令行选项(与命令行参数相反)
Alexander Stohr

3

您只需要在属性=> 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)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.