据我所知,如果我想在linux环境中使用pthread库,我必须包含pthread.h并使用-lpthread选项编译源代码。 但我不明白为什么我应该使用-lpthread选项进行编译。我认为该选项是多余的...因为我已经声明包含pthread.h头文件,以便gcc链接pthread库。为什么gcc没有通过阅读#include自动链接pthread库文件?
提前致谢。
答案 0 :(得分:19)
链接和编译是两个独立的阶段。
您包含标头pthread.h
,以便编译器了解数据类型&符号名称,您在源文件中使用但在pthread库头文件中定义/声明。
使用-lpthread
链接到pthread库,以便链接器可以在链接阶段实际在pthread库中找到这些符号。
答案 1 :(得分:4)
代码中包含#include <pthread.h>
不会链接到库中;它只包含编译头。这允许编译器查看包含的各种结构,函数声明等。让-lpthread
实际上导致链接完成链接。所以include告诉编译器什么是可用的,-lpthread
实际上允许程序在运行时调用库中的函数。
答案 2 :(得分:3)
因为GCC不会执行由标头包含触发的auto-linking库(与MSVC相反,或者我被告知)。
答案 3 :(得分:2)
头文件只声明pthread函数是什么以及如何调用它们。 -lpthread
链接到库本身,包含实际的函数。
编译器不知道你将如何解决pthread.h
中的函数。您可能希望使用静态库,系统提供的静态库,一些兼容的实现 - 哎呀,您可以在另一个源文件中自己实现它们。这取决于链接器,与编译器无关。
答案 4 :(得分:1)
通过包含头文件,您可以告诉编译器他将看到哪些函数。但是,如果这些函数位于外部库中,例如pthread
函数,则需要将此库链接到您的程序,以便它可以实际访问这些函数。这就是-lpthread
正在做的事情。
答案 5 :(得分:1)
Pthread.h头文件包含在posix线程程序中但您需要
编译时-lpthread
因为它将它与pthread库链接起来
注意: -lpthread
-lpcap
所有是带有gcc编译器的开关,可以链接我们源代码中的特定库。 (lpthread表示“链接pthread”库)