lib {library name} .a / .so是Linux中静态库的命名约定吗?

时间:2011-07-03 05:36:08

标签: linux ubuntu linker makefile

我最近不得不在Ubuntu系统上做一些小编程(我是一个非常低级的初学者)而且我真的只是熟悉makefile。

我注意到告诉链接器要包含哪些库的参数总是-l {library name},其中相应的库在/ usr / lib文件夹中称为“lib {library name} .a”。< / p>

我想知道:这是一个会议吗?我原本以为我需要输入-llibNAME来找到一个名为libNAME.a的库,但它似乎假设一个lib前缀。

总是这样吗?我可以在不使用lib前缀的情况下命名库吗?

4 个答案:

答案 0 :(得分:17)

您可以按照您想要的任何方式命名,但ld的{​​{1}}假设-l前缀适用于静态和共享库并且可以追溯到很久;你需要明确地命名它以使用没有lib前缀的那个。

即使在现代系统上,这实际上也很有用:名称lib可以标识为链接时库,而libfoo.so表示实现运行时插件的共享对象。或者用子系统特定的前缀代替foo.so来识别特定子系统的插件;例如,请参阅libpam_*.so

答案 1 :(得分:12)

name.a是一个静态库(a,因为它是对象的存档)。

name.so是一个动态库(so,因为它是动态共享对象的共享对象,有时也称为DSO。)

-lfoo链接器开关传统上采用libfoo.{so,a}形式的名称,并在库路径上搜索它。您也可以直接将库名称传递给链接器(不使用-l开关),但在这种情况下,您必须明确地将路径传递给库。

@geekosaur所述,如果在运行时打开共享对象,dlopen()将获取完整的文件名。

答案 2 :(得分:3)

简短回答,是的,这是惯例。

g ++的-l选项将检查lib和本地路径中的lib {somename} .so。

但是在UNIX中,您还可以使用符号链接,因此您可以拥有不同版本的库,而无需修改make脚本。

编辑添加:

正如有人在评论中指出的那样,.a是静态库的扩展,而.so是共享库。

答案 3 :(得分:3)

实际上,没有。我的意思是,差不多!您正在将静态库与共享库混合使用。静态库是.a个文件,共享库以.so结尾。

总结一下,你在谈论共享库,好吗?将应用程序与共享库链接时,需要使用-lNAME的标准约定,其中 NAME 属于 libNAME.so