gcc默认使用libc库。
lib库在哪里 ?我还不知道。
.c文件中,包含的printf函数,在#include <stdio.h>中声明,stdio.h在/usr/include/ 目录下,.h中只有声明,没有定义,定义已经被搞成了库文件。
编译时,由于是<>,所以要到/usr/include/ 下面找, 发现有stdio.h这个文件,好,那就去libc库,链接printf函数。 stdio.h中声明的,libc库中都有。
但是,现在包含了,一个#include <pthread.h>,由于是<>, 所以,编译器到/usr/include/ 下面发现了这个pthread.h 这个文件,里面有好多函数的声明,这个时候,gcc同样照着去libc库中找函数的库文件,发现没有,这个时候,gcc不知道去哪里找了。这个时候需要指定了,如果不指定,那就说找不到这个函数的链接文件,说undefined reference to 'pthread_creat'...文件。为什么 ? 因为,链接时候gcc只到libc库中链接,而libc中又没有。所以只能说找不到了。
那么怎么解决 ?
手动指定,-lpthread。 其实这句话,gcc hello.c -lpthread 和 gcc hello.c -L /usr/lib -lpthread 这句话的效果是一样的。
因为, 如果你编译一个程序,你手动指定库了,那么你手动指定的这个库,就得按像找.h文件的方式一样来找。 1.先在当前目录中找 2.再在 -L 指定的目录中找 3.最后在系统指定的目录中找,就是/usr/lib 。 这里gcc hello.c -lpthread没有-L选项,那么先再当前目录中找,发现没有,又没-L指定,那么只能到/usr/lib/下面找了哦。
-----------------------
补充:
<>括起来的,直接到/usr/includes/ 找找到后,gcc直接到glibc库中链接。
“” 括起来的,gcc会先再本目录 -> -I 指定的目录 -> /usr/includes/ 中,中找到。如果是再/usr/includes/ 中找到的,同上。 如果就在本目录或者 -I 指定的目录中找到的,那么:gcc不会到glibc库中去链接,会在 本目录 -》 -L指定目录 -》/usr/lib 顺序的目录中找。
就是只有/usr/includes/ 目录中的头文件,gcc才会默认到glibc 库中链接。不是这里面的头文件,那么就是先 本目录-》-L指定的目录 -》/usr/lib/ 顺序的目录中找。