为什么某些静态库(lib * .a)的链接方式与链接共享库(lib * .so)的方式相同(ld -l switch),但有些不能?
我一直被教导所有的库,无论是否静态,都可以与-l ...链接,但是我到目前为止遇到了一个库(GLFW),除了喷出“未定义的引用”链接之外什么都不做如果我试图以这种方式链接它,就会出错。
根据this question的回复,链接静态库的“正确”方法是将它们与我自己的目标文件一起直接包含在内,而不是使用-l。而且,就GLFW库而言,这肯定解决了这个问题。但是当我与-l。
链接时,我使用的每个其他静态库都可以正常工作所以:
答案 0 :(得分:25)
感谢您的回复!原来问题是由于链接顺序。显然,如果您使用的库反过来又具有其他库依赖项,那么其他依赖项必须在库之后列出,而不是像我之前那样。学到了新东西!
答案 1 :(得分:6)
链接静态库的正确方法是使用-l,但只有在搜索路径上找到库时才有效。如果不是那么你可以使用-L将目录添加到列表中,或者按名称命名文件,如你所说。
实际上,共享库也是如此,尽管它们更有可能被发现。答案 2 :(得分:5)
你有没有向GCC表明你的图书馆的路径(使用-L)?通过单独使用-l,GCC将只能链接标准目录中可用的库。
-L[path] -l[lib]
答案 3 :(得分:1)
原因是历史性的。 “ar”工具是PDP11 unix上的原始文件存档工具,尽管后来为了这个目的完全被“tar”替换。它将文件(在这种情况下为目标文件)存储在包中。还有一个单独的扩展,包含链接器要使用的符号表。如果您手动管理存档中的符号表可能已过期的文件,则可能。
简短的回答是,您可以在任何存档上使用“ranlib”工具来重新创建符号表。试试吧。更广泛地说,试着找出腐败库的来源并修复它。