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

使用GCC链接静态库的正确方法,gcc,linker,static-libraries,static-linking,glfw,Gcc,Linker,Static Libraries,Static Linking,Glfw,为什么有些静态库(lib*.a)可以用与共享库(lib*.so)相同的方式链接(ld-l开关),但有些不能 我一直被教导所有的库,不管是静态的还是非静态的,都可以与-l…链接,但是到目前为止,我遇到了一个库(GLFW),如果我试图以这种方式链接它,它除了抛出“未定义的引用”链接错误外,什么也不做 根据上的回复,链接静态库的“正确”方法是直接将它们与我自己的对象文件一起包含,而不是使用-l。而且,就GLFW库而言,这无疑解决了这个问题。但是我使用的所有其他静态库在与-l链接时都可以正常工作 因此:

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

我一直被教导所有的库,不管是静态的还是非静态的,都可以与-l…链接,但是到目前为止,我遇到了一个库(GLFW),如果我试图以这种方式链接它,它除了抛出“未定义的引用”链接错误外,什么也不做

根据上的回复,链接静态库的“正确”方法是直接将它们与我自己的对象文件一起包含,而不是使用-l。而且,就GLFW库而言,这无疑解决了这个问题。但是我使用的所有其他静态库在与-l链接时都可以正常工作

因此:

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

您是否愿意向GCC指示库的路径(使用-L)?通过单独使用-l,GCC将只能链接标准目录中可用的库

-L[path] -l[lib]

原因是历史的。“ar”工具最初是pdp11unix上的文件归档工具,不过后来完全被“tar”所取代。它将文件(在本例中为对象文件)存储在包中。还有一个单独的扩展,包含链接器要使用的符号表。如果手动管理存档中的文件,则符号表可能会过期


简而言之,您可以在任何存档上使用“ranlib”工具来重新创建符号表。试试看。更广泛地说,试着找出损坏的库的来源并加以修复。

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


事实上,共享库也是如此,尽管它们可能更容易被找到

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

是的,每个库的路径都是在相应的-L标志之前使用-L提供的。GCC可以找到库,但是在库中给出了大量未定义的引用错误。我认为OP的意思是指向库的链接,而不是创建库。没有回答这个问题。是的,它解决了一些特定的问题,这可能促使你问这个一般性的问题。不幸的是,大多数人来到这里是为了得到所问问题(以及子问题)的答案。但是,用
-l
链接静态库和在链接行中加入
-l
前缀有什么区别?查看OP在问题末尾提出的问题。除了跳过搜索过程之外,没有区别。