#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
函数。任何想法出什么事了吗?#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)
评论
另外:根据平台的不同,您可能需要(a)线程的不同编译器,(b)线程的不同libc(即-lc_r),(c)-thread或-threads或其他,而不是-lpthread。在该示例的上方,您将看到一张正确的编译器命令表,无论是GCC,IBM等等。“ Employed Russian”是正确的。
您能否取消标记我的答案,以便我将其删除(并标记实际上正确的答案,即投票最高的答案)?
编译期间需要-lpthread
解决方案LDFLAGS = -pthread -lpthread