gcc hello.c -lpthread

本文详细解释了GCC编译器在链接阶段如何查找不同库文件的过程,特别是当遇到标准库之外的库文件时如何进行手动指定。

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/  顺序的目录中找。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值