我从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函数。任何想法出什么事了吗?

评论

另外:根据平台的不同,您可能需要(a)线程的不同编译器,(b)线程的不同libc(即-lc_r),(c)-thread或-threads或其他,而不是-lpthread。

在该示例的上方,您将看到一张正确的编译器命令表,无论是GCC,IBM等等。“ Employed Russian”是正确的。

您能否取消标记我的答案,以便我将其删除(并标记实际上正确的答案,即投票最高的答案)?

编译期间需要-lpthread

解决方案LDFLAGS = -pthread -lpthread

#1 楼

到目前为止,这个问题的两个答案都是错误的。
对于Linux,正确的命令是:和-lpthread不是“选项”,它是一个库规范。在仅安装了libpthread.a的系统上,

gcc -pthread -o term term.c


将无法链接。

评论


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

–holsapp
2012年1月13日在3:02

@sholsapp这是解释:webpages.charter.net/ppluzhnikov/linker.html

–雇用俄语
2012年1月13日下午4:33

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

–CornSmith
13年4月18日在23:49

我刚遇到在Ubuntu 14.04上编译snortsam的问题,实际上它同时具有libpthread.a和libpthread.so。我得到对“ pthread_cancel”的未定义引用和对“ pthread_create”错误的未定义引用。我碰到了这个SO帖子,以为我会尝试Employed Russian的答案。我在VI中打开了makesnortsam.sh并运行命令:%s / lpthread / pthread / g将pthread替换为pthread,以便在编译时使用-pthread而不是-lpthread。这样我就可以编译snortsam。谢谢用俄文!

–dcarrith
2014年7月5日在13:47



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

–user3728501
2015年10月4日13:23



#2 楼

在eclipse中

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

评论


相同的技巧也适用于code :: project(我认为其他IDE也是如此)

–填写
17年1月29日在17:00

我知道这可能会晚一点,但是。如果在属性中找不到C / C ++ Build设置(我找不到,也许是由于安装或错误),那么可以使用CMakeLists.txt文件直接进行较低级别的解决。您需要在add_executable命令之前插入SET(CMAKE_EXE_LINKER_FLAGS“ $ {CMAKE_EXE_LINKER_FLAGS} -pthread”)。这将指示链接器执行相同的操作(有关更多帮助,请参见CMAKE_EXE_LINKER_FLAGS和SET文档)。

–avneesh米什拉
9月10日7:13



#3 楼

对于Linux,正确的命令是:

gcc -o term term.c -lpthread



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


评论


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

– David Schwartz
19-09-25在2:01

#4 楼

从Linux终端运行,对我有用的是使用以下命令进行编译(假设我要编译的c文件称为test.c):

gcc -o test test.c -pthread
它对某人有帮助!

#5 楼

首先,如果您继续阅读以下教程,则会在下表中列出用于pthreads代码的几个编译命令示例:

https://computing.llnl.gov/tutorials/pthreads/ #Compiling



#6 楼

如果使用cmake,则可以使用:

add_compile_options(-pthread)




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


#7 楼

我相信在pthread中添加CMake的正确方法是使用以下

find_package (Threads REQUIRED)

target_link_libraries(helloworld
    ${CMAKE_THREAD_LIBS_INIT}
)


评论


这具有相同的效果,但是使用Threads :: Threads目标而不是CMAKE_THREAD_LIBS_INIT变量。 target_link_libraries(helloworld PUBLIC线程::线程)

–艾丹·加拉格尔(Aidan Gallagher)
8月9日在16:34



#8 楼

像这样编译它:gcc demo.c -o demo -pthread

#9 楼

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


链接器->命令行->其他选项
在文本框中输入-pthread

#10 楼

您需要在gcc中使用选项-lpthread

评论


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

–user1709175
15年7月13日在17:32

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

–亚历山大·斯托尔
19年6月19日在16:36

#11 楼

您只需要在属性=> C / C ++ build => GCC C ++ Linker => Libraries =>顶部“ Libraries(-l)”中添加“ pthread”即可。

#12 楼

检查手册页,您会得到。

使用-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.
       ....


#13 楼

在Anjuta中,转到“生成”菜单,然后“配置项目”。
在“配置选项”框中,添加:

LDFLAGS='-lpthread'


希望对别人也有帮助。

#14 楼

有时,如果您使用多个库,请检查库的依赖关系。
(例如-lpthread -lSDL ... <==> ... -lSDL -lpthread)