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

Nai*_*rou 22 linker gcc static-libraries glfw static-linking

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

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

根据对这个问题的回答,链接静态库的"正确"方法是将它们与我自己的目标文件一起直接包含在内,而不是使用-l.而且,就GLFW库而言,这肯定解决了这个问题.但是我正在使用的每个其他静态库在与-l链接时工作得很好.

所以:

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

Nai*_*rou 25

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


ams*_*ams 6

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

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


小智 5

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

-L[path] -l[lib]
Run Code Online (Sandbox Code Playgroud)