gcc的-lpthread选项

17
据我所知,如果我想在Linux环境下使用pthread库,就必须包含pthread.h并使用-lpthread选项编译源代码。 但是我不明白为什么我需要使用-lpthread选项进行编译。我认为这个选项是多余的,因为我已经声明包括pthread.h头文件,所以gcc链接pthread库。为什么gcc不能通过读取#include自动链接pthread库文件呢? 提前感谢您的回答。

4
相关:https://dev59.com/x3I95IYBdhLWcg3w2Rvz,你也应该使用“-pthread”。 - Mat
6个回答

29

在IT技术中,链接编译是两个独立的阶段。

当你在源文件中使用pthread库头文件中定义或声明的数据类型和符号名称时,需要包含头文件pthread.h以便编译器能够理解。

在链接阶段,你需要使用-lpthread来链接到pthread库,以便链接器能够在库中找到这些符号。


5
当我们使用strcpy或printf时,为什么不需要明确包含某些库进行链接呢?这是因为它们都在C标准库中,并且默认已经包含了该库,而任何不在该库之外的内容必须明确进行链接。 - master_latch
@master_latch:是的,那正是原因。 - Alok Save

6

在你的代码中使用#include <pthread.h>并不会链接库,它只是为编译包含头文件。这允许编译器查看各种结构、函数声明等内容。而使用-lpthread则实际上会导致链接器进行链接。因此,包含告诉编译器可用的内容,而-lpthread则允许程序在运行时调用库中的函数。


3

因为GCC不会像MSVC那样通过头文件包含来触发库的自动链接(即auto-linking),所以需要手动指定链接库。


1
确实有一个 #pragma 选项可以在 MSVC 中链接库,但它很少被使用(并且通常被认为是不好的实践)。 - James M

3
头文件只是声明了pthread函数及其调用方式。 -lpthread 链接到实际包含这些函数的库。

编译器不知道如何解析pthread.h中的函数。你可能想使用静态库、系统提供的库、兼容的实现,甚至在另一个源文件中自己实现它们。这由链接器决定,与编译器无关。


1

pthread.h头文件包含在posix线程程序中,但编译时需要使用-lpthread链接pthread库。 注意:-lpthread -lpcap都是gcc编译器的开关,可以将特定库链接到我们的源代码中。(lpthread表示“链接pthread”库)


1
通过包含头文件,您告诉编译器他将看到哪些函数。但是如果这些函数在外部库中,例如pthread函数,您需要将此库链接到您的程序中,以便它实际上可以访问这些函数。这就是-lpthread的作用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接