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

8bi*_*dge 12 linux ubuntu linker makefile

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

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

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

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

gee*_*aur 18

您可以命名一个你想要的任何方式,但ld-l假设lib前缀适用于静态和共享库,并可以追溯到很长的路要走; 你需要明确地命名它以使用没有lib前缀的.

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


nin*_*alj 12

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

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

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

如上所述@geekosaur,如果在运行时打开共享对象,则dlopen()采用完整文件名.