|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
要明白学好linux不是一件一蹴而就的事,一定要能坚持使用它,特别是在使用初期。
库有静态与静态两种,静态一般用。so为后缀,静态用。a为后缀。比方:libhello.solibhello.a
为了在统一体系中利用分歧版本的库,能够在库文件名后加上版本号为后缀,比方:libhello.so.1.0,因为程序毗连默许以。so为文件后缀名。以是为了利用这些库,一般利用创建标记毗连的体例。
ln-slibhello.so.1.0libhello.so.1
ln-slibhello.so.1libhello.so
利用库
当要利用静态的程序库时,毗连器会找出程序所需的函数,然后将它们拷贝到实行文件,因为这类拷贝是完全的,以是一旦毗连乐成,静态程序库也就不再必要了。但是,对静态库而言,就不是如许。静态库会在实行程序内留下一个标志‘指明当程序实行时,起首必需载进这个库。因为静态库节俭空间,linux下举行毗连的缺省操纵是起首毗连静态库,也就是说,假如同时存在静态和静态库,不出格指定的话,将与静态库相毗连。
如今假定有一个叫hello的程序开辟包,它供应一个静态库libhello.a一个静态库libhello.so,一个头文件hello.h,头文件中供应sayhello()这个函数
/*hello.h*/
voidsayhello();
别的另有一些申明文档。这一个典范的程序开辟包布局
1.与静态库毗连
linux默许的就是与静态库毗连,上面这段程序testlib.c利用hello库中的sayhello()函数
/*testlib.c*/
#include
#include
intmain()
{
sayhello();
return0;
}
利用以下命令举行编译
$gcc-ctestlib.c-otestlib.o
用以下命令毗连:
$gcctestlib.o-lhello-otestlib
在毗连时要注重,假定libhello.o和libhello.a都在缺省的库搜刮路径下/usr/lib下,假如在别的地位要加上-L参数
2.与静态库毗连贫苦一些,次要是参数成绩。仍是下面的例子:
$gcctestlib.o-otestlib-WI,-Bstatic-lhello
注:这个出格的"-WI,-Bstatic"参数,实践上是传给了毗连器ld.
唆使它与静态库毗连,假如体系中只要静态库固然就不必要这个参数了。
假如要和多个库相毗连,而每一个库的毗连体例纷歧样,好比下面的程序既要和libhello举行静态毗连,又要和libbye举行静态毗连,其命令应为:
$gcctestlib.o-otestlib-WI,-Bstatic-lhello-WI,-BdynamicClbye
3.静态库的路径成绩
为了让实行程序顺遂找到静态库,有三种办法:
(1)把库拷贝到/usr/lib和/lib目次下。
(2)在LD_LIBRARY_PATH情况变量中加上库地点路径。比方静态库libhello.so在/home/ting/lib目次下,以bash为例,利用命令:
$exportLD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/ting/lib
(3)修正/etc/ld.so.conf文件,把库地点的路径加到文件开端,并实行ldconfig革新。如许,到场的目次下的一切库文件都可见。
4.检察库中的标记
偶然候大概必要检察一个库中究竟有哪些函数,nm命令能够打印出库中的触及到的一切标记。库既能够是静态的也能够是静态的。nm列出的标记有良多,罕见的有三种,一种是在库中被挪用,但并没有在库中界说(标明必要其他库撑持),用U暗示;一种是库中界说的函数,用T暗示,这是最多见的;别的一种是所谓的“弱态”标记,它们固然在库中被界说,可是大概被其他库中的同名标记掩盖,用W暗示。比方,假定开辟者但愿晓得上文提到的hello库中是不是界说了printf():
$nmlibhello.so|grepprintf
Uprintf
U暗示标记printf被援用,可是并没有在函数内界说,由此能够揣度,要一般利用hello库,必需有别的库撑持,再利用ldd命令检察hello依附于哪些库:
$lddhello
libc.so.6=>/lib/libc.so.6(0x400la000)
/lib/ld-linux.so.2=>/lib/ld-linux.so.2(0x40000000)
从下面的了局能够持续检察printf终极在那里被界说,有乐趣能够goon
天生库
第一步要把源代码编绎成方针代码。以上面的代码为例,天生下面用到的hello库:
/*hello.c*/
#include
voidsayhello()
{
printf("hello,world
");
}
用gcc编绎该文件,在编绎时可使用任何全法的编绎参数,比方-g到场调试代码等:
gcc-chello.c-ohello.o
(1)。毗连成静态库
毗连成静态库利用ar命令,实在ar是archive的意义
$arcqslibhello.ahello.o
(2)。毗连成静态库
天生静态库用gcc来完成,因为大概存在多个版本,因而一般指定版本号:
$gcc-shared-Wl,-soname,libhello.so.1-olibhello.so.1.0hello.o
别的再创建两个标记毗连:
$ln-slibhello.so.1.0libhello.so.1
$ln-slibhello.so.1libhello.so
如许一个libhello的静态毗连库就天生了。最主要的是传gcc-shared参数使其天生是静态库而不是一般实行程序。
-Wl暗示前面的参数也就是-soname,libhello.so.1间接传给毗连器ld举行处置。实践上,每个库都有一个soname,当毗连器发明它正在查找的程序库中有如许一个称号,毗连器便会将soname嵌进保持中的二进制文件内,而不是它正在运转的实践文件名,在程序实行时代,程序会查找具有soname名字的文件,而不是库的文件名,换句话说,soname是库的辨别标记。
如许做的目标次要是同意体系中多个版本的库文件共存,习气上在定名库文件的时分一般与soname不异
libxxxx.so.major.minor
个中,xxxx是库的名字,major是主版本号,minor是次版本号</p>
如果你让他去用linux搭建一个web服务器,做一个linux网关,他就什么都不会了.他们把时间都浪费在了版本的转换上了. |
|