Linux 中对 pthread_create 的未定义引用
Posted
技术标签:
【中文标题】Linux 中对 pthread_create 的未定义引用【英文标题】:Undefined reference to pthread_create in Linux 【发布时间】:2010-12-12 09:14:04 【问题描述】:我从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) 不同的线程库(即-lc_r
),(c) -thread
或 @ 987654328@ 或其他,代替或补充-lpthread
。
略高于该示例,您将看到正确的编译器命令表,无论是 GCC、IBM 等。“Employed Russian”是正确的。
您能否取消标记我的答案,以便我删除它(并标记实际正确的答案,即投票最高的答案)?
编译时需要-lpthread
解决方案LDFLAGS= -pthread -lpthread
【参考方案1】:
对于 Linux,正确的命令是:
gcc -pthread -o term term.c
一般来说,库应该遵循命令行上的源和对象,-lpthread
不是一个“选项”,它是一个库规范。在只安装了libpthread.a
的系统上,
gcc -lpthread ...
将无法链接。
【讨论】:
+1 这个解决方案有效......其他人没有。此外,“图书馆应遵循来源和对象”的建议是很好的建议——引用或进一步解释会很好。 @sholsapp 这里是解释:webpages.charter.net/ppluzhnikov/linker.html 这对我来说仍然是错误的,直到我将 -lpthread 放在命令的最后。gcc term.c -lpthread
对于使用 CODEBLOCKS 的任何人:将 -pthread
添加到项目构建选项 -> 链接器设置 -> 其他链接器选项。
“在只安装了 libpthread.a 的系统上”......还是libpthread.so
,对吧?【参考方案2】:
对于 Linux,正确的命令是:
gcc -o term term.c -lpthread
-
你必须在编译命令之后加上-lpthread,这个命令会告诉编译器执行带有pthread.h库的程序。
gcc -l 链接库文件。链接 -l 库名不带 lib 前缀。
【讨论】:
当您的平台上存在具有相同功能的标准标志时,使用非标准标志不是一个好主意。【参考方案3】:在日食中
properties->c/c++Build->setting->GCC C++ linker->libraries in top part add "pthread"
【讨论】:
code::project 中也有相同的提示(我认为其他 IDE 也是如此) 我知道这可能有点晚了,但是。如果您在属性中找不到 C/C++ Build 设置(我找不到,可能是由于安装或错误),那么使用 CMakeLists.txt 文件有一个直接的较低级别的解决方法。您需要在 add_executable 命令之前插入SET(CMAKE_EXE_LINKER_FLAGS "$CMAKE_EXE_LINKER_FLAGS -pthread")
。这将指示链接器执行相同的操作(请参阅 CMAKE_EXE_LINKER_FLAGS 和 SET 文档以获取更多帮助)。【参考方案4】:
从 Linux 终端运行,对我有用的是使用以下命令进行编译(假设我要编译的 c 文件名为 test.c):
gcc -o test test.c -pthread
希望对某人有所帮助!
【讨论】:
在 Ubuntu 16.x 中确认【参考方案5】:如果你使用的是cmake,你可以使用:
add_compile_options(-pthread)
或者
SET(CMAKE_CXX_FLAGS "$CMAKE_CXX_FLAGS -pthread")
【讨论】:
【参考方案6】:我相信在CMake
中添加pthread
的正确方法是如下
find_package (Threads REQUIRED)
target_link_libraries(helloworld
$CMAKE_THREAD_LIBS_INIT
)
【讨论】:
这具有相同的效果,但使用了 Threads::Threads 目标而不是 CMAKE_THREAD_LIBS_INIT 变量。target_link_libraries(helloworld PUBLIC Threads::Threads)
【参考方案7】:
实际上,它给出了几个用于pthreads的编译命令示例,代码如下表所示,如果您继续阅读以下教程:
https://computing.llnl.gov/tutorials/pthreads/#Compiling
【讨论】:
【参考方案8】:这样编译:gcc demo.c -o demo -pthread
【讨论】:
【参考方案9】:在 Visual Studio 2019 中,在以下项目的属性页中指定 -pthread
:
链接器 -> 命令行 -> 附加选项
在文本框中输入-pthread
。
【讨论】:
当我这样做时,我收到错误“pthread:没有这样的文件或目录”【参考方案10】:您需要在 gcc 中使用选项 -lpthread
。
【讨论】:
错误信息!-lpthread
不是“选项”,它指定了一个库。
命令行选项(与命令行参数相反)【参考方案11】:
您只需要在 proprieties=>C/C++ build=>GCC C++ Linker=>Libraries=> 顶部“Libraries(-l)”中添加“pthread”。 就是这样
【讨论】:
【参考方案12】:由于没有一个答案完全满足我的需求(使用 MSVS 代码),因此我也在这里添加了我使用此 IDE 和 CMAKE 构建工具的经验。
第 1 步:确保在您的 .cpp(或 .hpp,如果需要)中包含:
#include <functional>
步骤 2 对于 MSVSCode IDE 用户: 将此行添加到您的 c_cpp_properties.json 文件中:
"compilerArgs": ["-pthread"],
第 2 步对于 CMAKE 构建工具用户: 将此行添加到您的 CMakeLists.txt
set(CMAKE_CXX_FLAGS "-pthread")
注意:添加标志 -lpthread(而不是 -pthread)会导致链接失败。
【讨论】:
【参考方案13】:检查手册页,你会得到。
使用 -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.
....
【讨论】:
【参考方案14】:在 Anjuta 中,转至 Build 菜单,然后选择 Configure Project。 在配置选项框中,添加:
LDFLAGS='-lpthread'
希望它也能帮助别人......
【讨论】:
【参考方案15】:有时,如果您使用多个库,请检查库依赖关系。 (例如 -lpthread -lSDL... ... -lSDL -lpthread)
【讨论】:
以上是关于Linux 中对 pthread_create 的未定义引用的主要内容,如果未能解决你的问题,请参考以下文章
linux 之 pthread_create 实现类的成员函数做参数
[Linux] Linux下undefined reference to ‘pthread_create’问题解决
Linux C语言 pthread_create()创建线程失败的handle_error_en宏(取自man文档demo)errnoperror()