我最近不得不在Ubuntu系统上做一些小编程(我是一个非常低级的初学者)而且我真的只是熟悉makefile。
我注意到告诉链接器要包含哪些库的参数总是-l {library name},其中相应的库在/ usr / lib文件夹中称为“lib {library name} .a”。< / p>
我想知道:这是一个会议吗?我原本以为我需要输入-llibNAME来找到一个名为libNAME.a的库,但它似乎假设一个lib前缀。
总是这样吗?我可以在不使用lib前缀的情况下命名库吗?
答案 0 :(得分:17)
您可以按照您想要的任何方式命名,但ld
的{{1}}假设-l
前缀适用于静态和共享库并且可以追溯到很久;你需要明确地命名它以使用没有lib
前缀的那个。
即使在现代系统上,这实际上也很有用:名称lib
可以标识为链接时库,而libfoo.so
表示实现运行时插件的共享对象。或者用子系统特定的前缀代替foo.so
来识别特定子系统的插件;例如,请参阅lib
和pam_*.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