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 等链接器就是这么做的。
分享:
喜欢
0
赠金笔
加载中,请稍候......
评论加载中,请稍候...
发评论
登录名: 密码: 找回密码 注册记住登录状态
昵 称:
评论并转载此博文
发评论
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。