Gcc 链接到静态库的两种方法

Gcc 链接到静态库的两种方法,gcc,ld,unix-ar,Gcc,Ld,Unix Ar,以下是使用静态库中的函数的几种方法,这些函数用ar压缩(即libSOMTEHING.a): ld-Lpath/to/library-lname myapp.o-o结果 ld path/to/library/libname.a myapp.o-o结果 有什么区别?例如,整个库是在可执行文件中链接的,还是仅仅是所需的函数?在第二个示例中,切换库和对象文件的位置是否重要 在第一行中,在目录中的静态库(libname.a)之前搜索动态库(libname.so)。此外,还将在标准库路径中搜索libname

以下是使用静态库中的函数的几种方法,这些函数用ar压缩(即libSOMTEHING.a):

ld-Lpath/to/library-lname myapp.o-o结果
ld path/to/library/libname.a myapp.o-o结果


有什么区别?例如,整个库是在可执行文件中链接的,还是仅仅是所需的函数?在第二个示例中,切换库和对象文件的位置是否重要

在第一行中,在目录中的静态库(libname.a)之前搜索动态库(libname.so)。此外,还将在标准库路径中搜索libname.*,而不仅仅是/path/to/library

来自《男人的爱》

在支持共享库的系统上,ld还可以搜索 libnamespec.a以外的文件。特别是在ELF和SunOS上 系统,ld将搜索一个名为 所以在搜索libnamespec.a之前。(由 约定,“.so”扩展名表示共享库。)

第二行强制链接器使用path/to/lib处的静态库


如果没有生成动态库(libname.so),并且唯一可用的库是path/to/library/libname.a,那么这两行将生成相同的“result”二进制文件。

1)“-Lpath/to/library”允许您在“path/to/library”中查找多个库;硬编码。路径不会。2) 如果.o需要.a中的模块,那么库应该在之后出现。假设没有.so库。然后,二进制文件将是相同的,因为与另一个调用相比,在其中一个调用中不会链接额外的函数。对的