使用GCC链接静态库的正确方法

时间:2012-03-31 01:10:46

标签: gcc linker static-libraries static-linking glfw

为什么某些静态库(lib * .a)的链接方式与链接共享库(lib * .so)的方式相同(ld -l switch),但有些不能?

我一直被教导所有的库,无论是否静态,都可以与-l ...链接,但是我到目前为止遇到了一个库(GLFW),除了喷出“未定义的引用”链接之外什么都不做如果我试图以这种方式链接它,就会出错。

根据this question的回复,链接静态库的“正确”方法是将它们与我自己的目标文件一起直接包含在内,而不是使用-l。而且,就GLFW库而言,这肯定解决了这个问题。但是当我与-l。

链接时,我使用的每个其他静态库都可以正常工作

所以:

  • 什么可能导致这个库在链接时不起作用而不是直接包含?如果我知道原因,也许我可以编辑并重新编译库以解决问题。
  • 您是否应该像链接共享库一样链接静态库? (如果没有,为什么不呢?)
  • 当以这种方式直接包含库时,链接器是否仍能从输出可执行文件中删除未使用的库函数?

4 个答案:

答案 0 :(得分:25)

感谢您的回复!原来问题是由于链接顺序。显然,如果您使用的库反过来又具有其他库依赖项,那么其他依赖项必须在库之后列出,而不是像我之前那样。学到了新东西!

答案 1 :(得分:6)

链接静态库的正确方法是使用-l,但只有在搜索路径上找到库时才有效。如果不是那么你可以使用-L将目录添加到列表中,或者按名称命名文件,如你所说。

实际上,共享库也是如此,尽管它们更有可能被发现。

答案 2 :(得分:5)

你有没有向GCC表明你的图书馆的路径(使用-L)?通过单独使用-l,GCC将只能链接标准目录中可用的库。

-L[path] -l[lib]

答案 3 :(得分:1)

原因是历史性的。 “ar”工具是PDP11 unix上的原始文件存档工具,尽管后来为了这个目的完全被“tar”替换。它将文件(在这种情况下为目标文件)存储在包中。还有一个单独的扩展,包含链接器要使用的符号表。如果您手动管理存档中的符号表可能已过期的文件,则可能。

简短的回答是,您可以在任何存档上使用“ranlib”工具来重新创建符号表。试试吧。更广泛地说,试着找出腐败库的来源并修复它。