linux连接库参数-l,gcc编译时,什么时候需要用-l参数指明连接库?

gcc编译时,什么时候需要用-l参数指明连接库?

(2012-04-10 01:18:32)

标签:

杂谈

gcc编译时,什么时候需要用-l参数指明连接库?例如,需要连接线程库libpthread.a时,必须用-lpthread。

可是这个线程库也在标准目录/usr/include/lib/下,为什么必须专门指明连接这个库?

是不是只有c语言标准库,才不用-l参数指明?不一定的,这个是你的cc工具的配置有关系。

比如aix下的

more /etc/vac.cfg

xlc: use = DEFLT

crt = /lib/crt0.o

mcrt = /lib/mcrt0.o

gcrt = /lib/gcrt0.o

libraries= -L/usr/lpp/xlopt,-lxlopt,-lc ####### 看到了吗?

proflibs = -L/lib/profiled,-L/usr/lib/profiled

options = -qansialias

谢谢ivhb!回复好快啊。

还是不太明白,我用的是gcc,不知道这个工具的配置在哪里。命令如下:

gcc -o test test.c -lpthread

gcc 没有用过:),不知道gcc是否有-v选项,如果有的话,你可以打开那个选项。看看具体的过程。比如我的aix下

/tmp>cat a.c

#include

int

main(void)

{

printf("hello world\n");

}

/tmp>cc -v a.c

exec: export(export,XL_CONFIG=/etc/vac.cfg:cc,NULL)

exec:

/usr/vac/exe/xlcentry(/usr/vac/exe/xlcentry,-D_AIX,-D_AIX32,-D_AIX41,-D_AI

X43,-D_AIX50,-D_AIX51,-D_AIX52,-D_IBMR2,-D_POWER,-qlanglvl=extended,-qnoro,-qnor

oconst,-oa.o,a.c,/tmp/xlcW0Utqeqa,/tmp/xlcW1Utqeqb,/dev/null,a.lst,/dev/null,/tm

p/xlcW2Utqeqc,NULL)

exec: export(export,XL_BACKEND=/usr/vac/exe/xlCcode,NULL)

exec: export(export,XL_LINKER=/bin/ld,NULL)

exec: export(export,XL_DIS=/usr/vac/exe/dis,NULL)

exec:

/usr/vac/exe/xlCcode(/usr/vac/exe/xlCcode,-qlanglvl=extended,-qnoro,-qnoro

const,/tmp/xlcW0Utqeqa,/tmp/xlcW1Utqeqb,a.o,a.lst,/tmp/xlcW2Utqeqc,NULL)

exec:

/bin/ld(/bin/ld,-b32,/lib/crt0.o,-bpT:0x10000000,-bpD:0x20000000,a.o,-L/us

r/lpp/xlopt,-lxlopt,-lc,NULL)

unlink: a.o

unlink: /tmp/xlcW0Utqeqa

unlink: /tmp/xlcW1Utqeqb

unlink: /tmp/xlcW2Utqeqc

回复的有点儿文不对题,希望-v有助于你的理解,有所启发吧谢谢http://www.xssio.com/!很有启发,先学习学习。

$ gcc -v -o a hello_multi.c

Using built-in specs.

Target: i486-linux-gnu

Configured with: ../src/configure -v

--enable-languages=c,c++,fortran,objc,obj-c++,treelang

--prefix=/usr --enable-shared --with-system-zlib

--libexecdir=/usr/lib --without-included-gettext

--enable-threads=posix --enable-nls --program-suffix=-4.1

--enable-__cxa_atexit --enable-clocale=gnu --enable-libstdcxx-debug

--enable-mpfr --enable-checking=release i486-linux-gnu

Thread model: posix

gcc version 4.1.2 20060928 (prerelease) (Ubuntu

4.1.1-13ubuntu5)

/usr/lib/gcc/i486-linux-gnu/4.1.2/cc1 -quiet -v hello_multi.c

-quiet -dumpbase hello_multi.c -mtune=generic -auxbase hello_multi

-version -fstack-protector -fstack-protector -o

/tmp/cc3GUfz5.s

ignoring nonex

1b88af60

as -V -Qy -o /tmp/ccwi6K28.o /tmp/cc3GUfz5.s

GNU assembler version 2.17 (i486-linux-gnu) using BFD version 2.17

Debian GNU/Linux

/usr/lib/gcc/i486-linux-gnu/4.1.2/collect2 --eh-frame-hdr -m

elf_i386 -dynamic-linker /lib/ld-linux.so.2 -o a

/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../lib/crt1.o

/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../lib/crti.o

/usr/lib/gcc/i486-linux-gnu/4.1.2/crtbegin.o

-L/usr/lib/gcc/i486-linux-gnu/4.1.2

-L/usr/lib/gcc/i486-linux-gnu/4.1.2

-L/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../lib -L/lib/../lib

-L/usr/lib/../lib /tmp/ccwi6K28.o -lgcc --as-needed -lgcc_s

--no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed

/usr/lib/gcc/i486-linux-gnu/4.1.2/crtend.o

/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../lib/crtn.o

/tmp/ccwi6K28.o: In function `main':

hello_multi.c:(.text+0x30)http://www.faminorson.com:对‘pthread_create’未定义的引用

hello_multi.c:(.text+0x5f):对‘pthread_create’未定义的引用

hello_multi.c:(.text+0x72):对‘pthread_join’未定义的引用

collect2: ld returned 1 exit status

首先,libpthread.a一般在/usr/lib下不可能在/usr/include/lib下吧?

/usr/lib下有很多库,gcc默认只载入c/c++语言使用的标准库,如标准io库(如printf)和标准模板库(stl,g++),

其它的库都载入的话程序就太大了

gcc也不会自动去寻找系统中的所有库,谁知道你系统中有多少库呢?原帖由 tysn 于 2007-8-4 21:17 发表

http://bbs.chinaunix.net/images/common/back.gif

首先,libpthread.a一般在/usr/lib下不可能在/usr/include/lib下吧?

/usr/lib下有很多库,gcc默认只载入c/c++语言使用的标准库,如标准io库(如printf)和标准模板库(stl,g++),

其它的库都载入的话程序 ...

thanks!

是的,/usr/include/lib是笔误,应该是/usr/lib/

我也猜测gcc不搜索库文件,因为libpthread.a和其他标准库文件如libc.a等都在同一个目录下。只是不懂,为什么头文件.h会在设定路径下搜索,库文件就不进行搜索呢,两者关系密切,处理上却有差异。

如你所言,库文件,是以载入的方式使用。这里载入是指什么?不知道连接的过程,如何找到应当连接的object文件,如何连接。

[ 本帖最后由 TAW 于 2007-8-5 10:33 编辑 ]网上有一份文档

Loaders>

http://www.linuxforum.net/forum/showflat.php?Cat=&Board=program&Number=483117&page=0&view=collapsed&sb=5&o=7&fpart=

建议看一看.原帖由 TAW 于 2007-8-5 10:26 发表

http://bbs.chinaunix.net/images/common/back.gif

thanks!

是的,/usr/include/lib是笔误,应该是/usr/lib/

我也猜测gcc不搜索库文件,因为libpthread.a和其他标准库文件如libc.a等都在同一个目录下。只是不懂,为什么头文件.h会在设定路径下搜索,库文

...

之所以不搜索,是因为链接器不知道要搜索什么,它怎么知道你要链接什么库?如果对所有当前未被解析的符号都搜索一下的话,不但效率成问题,也不可靠。如果你能在代码中告诉链接器需要什么库的话,它当然可以直接帮你搜索,事实上

Plan 9 上的 8l 等链接器就是这么做的。

分享:

a4c26d1e5885305701be709a3d33442f.png喜欢

0

a4c26d1e5885305701be709a3d33442f.png赠金笔

加载中,请稍候......

评论加载中,请稍候...

发评论

登录名: 密码: 找回密码 注册记住登录状态

昵   称:

评论并转载此博文

a4c26d1e5885305701be709a3d33442f.png

发评论

以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值