道歉,因为目前我没有环境进行试验,并整理出以下几个问题我自己:

1)比方说,我有四个库文件:libmylib_super.alibmylib_super.somylib_dumb.amylib_dumb.so。同时指定库来连结,什么是下文中之间的区别的方法:

A)-l:libmylib_super.a结果 B)-llibmylib_super结果 C)-lmylib_super结果 d)-lmylib_dumb

2)从人页-static的定义:

  

在系统的支持动态   连接,由此,能够防止与链接   共享库。在其他   系统,该选项将不起作用。

这是否连接选项有什么关系问题#1?或...任何机会,他们会互相干扰?

感谢。

---编辑2009-12-28 ---

我刚刚得到了我的环境,并试验了一下,通过链接来提高DATE_TIME库。说我有三个库文件:libboost_date_time-mt-d.alibboost_date_time-mt-d.so.1.41.0libboost_date_time-mt-d.so -> libboost_date_time-mt-d.so.1.41.0(符号链接)

A.1)-l:libboost_date_time-mt-d.a ==>链接OK,二进制的作品即使没有库文件。点击 A.2)-l:libboost_date_time-mt-d.a-static ==>的链接错误 /usr/bin/ld: cannot find -lm

C.1)-lboost_date_time-mt-d ==>联行,二进制作品但需要共享库文件。结果 C.2)-lboost_date_time-mt-d-static ==>的链接错误 /usr/bin/ld: cannot find -lm

约在A.2和C.2错误任何想法?

此外,在C.1运行程序时,它似乎搜索的共享库文件名称为libboost_date_time-mt-d.so.1.41.0但不是libboost_date_time-mt-d.so。那会不会不方便,如果程序在系统上运行,而不库的确切版本?在使用共享库有什么能处理版本的实用方法是什么?

有帮助吗?

解决方案

根据手册,

A)搜索一个文件名为恰好libmylib_super.a(检索第一对共享库行为不适)

库路径

B)为一个文件名为liblibmylib_super.so第一,如果使用liblibmylib_super.a搜索库路径然后liblibmylib_super.a或只搜索一个文件名为-static - 注意这是其将所述lib前缀和文件扩展名

的接头

C)搜索库路径为一个文件名为libmylib_super.so第一然后libmylib_super.a或者如果使用仅liblibmylib_super.so为文件名为-static搜索

d)见C)

请注意,B)将无法正常工作,因为它是应该的lib前缀添加到库中名字的链接。

请注意d)将无法工作,因为你的mylib_dumb不遵循命名约定。

请参阅 GNU链接器手册

  

-l namespec

     

- 库= namespec

     

由namespec指定的存档或对象文件添加到文件链接的列表。此选项可以使用任意次数。如果namespec的形式为:文件名,LD将搜索库路径为一个名为filename文件,否则它将搜索一个称为libnamespec.a文件库路径

     

在支持共享库的系统中,LD也可以搜索不是libnamespec.a其他文件。具体来说,在ELF和SunOS系统,劳工处会搜索目录以寻找一个叫libnamespec.a前libnamespec.so称为库。 (按照惯例,一个.so扩展名指示的共享库。)请注意,此行为并不适用于:文件名,其总是指定一个名为filename文件

     

链接器将搜索归档,只有一次,在其被在命令行上指定的位置。如果存档限定其在一些对象,它在命令行上的归档之前出现未定义一个符号,链接器将包括从存档适当的文件(多个)。然而,在以后的命令行上出现的对象的未定义的符号不会导致接头再次搜索存档。

     

请参阅的 - (选项一种方式来强制链接器多次搜索档案

     

您可以在相同的归档文件多次列出在命令行上。

     

此类型归档检索的是用于Unix的接头的标准。但是,如果您使用的是AIX LD,需要注意的是从AIX链接的行为不同。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top