为什么使用-l时gcc会动态链接?

为什么使用-l时gcc会动态链接?,gcc,linker,shared-libraries,static-libraries,Gcc,Linker,Shared Libraries,Static Libraries,我使用pthread库编写了一个“Hello World”程序。 我的编译方法很简单: $ gcc main.c -lpthread 根据gcc文件(“链接选项”部分): -llibrary[…]链接器搜索库的标准目录列表,实际上是一个名为liblibrary.a的文件。链接器 然后使用该文件,就好像它是由名称精确指定的一样。 [……] 因此,我的理解是:gcc正在寻找libpthread.a。给定.a结尾,这应该是一个静态库 但是,这是动态链接的: $ ldd a.out l

我使用pthread库编写了一个“Hello World”程序。 我的编译方法很简单:

$ gcc main.c -lpthread
根据gcc文件(“链接选项”部分):

-llibrary[…]链接器搜索库的标准目录列表,实际上是一个名为liblibrary.a的文件。链接器 然后使用该文件,就好像它是由名称精确指定的一样。 [……]

因此,我的理解是:gcc正在寻找libpthread.a。给定.a结尾,这应该是一个静态库

但是,这是动态链接的:

$ ldd a.out
        linux-vdso.so.1 =>  (0x00007fffde3c3000)
        libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fb345820000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fb345456000)
        /lib64/ld-linux-x86-64.so.2 (0x00007fb345a3d000)

我遗漏了什么?

GCC手册中
-l |--library
选项的文档具有误导性, 在这种情况下,它没有指定支持该选项的系统上选项的行为 共享库,或警告我们它不会这样做

-l
选项被传递到链接器,通常是GNU
ld
(或者drop-in-alternative)。中选项的文档 更高级,并明确表示共享库将满足
-l
选项 而不是静态库

-l名称规范

--library=namespec

将namespec指定的存档文件或对象文件添加到要链接的文件列表中。 此选项可以使用任意次数。如果namespec的格式为:filename, ld将在库路径中搜索名为filename的文件,否则将搜索> 名为libnamespec.a的文件的库路径

在支持共享库的系统上,ld还可以搜索libnamespec.a以外的文件。 特别是在ELF和SunOS系统上,ld将在目录中搜索名为libnamespec.so的库,然后再搜索名为libnamespec.a的库。 (按照惯例,.so扩展名表示共享库。) 请注意,此行为不适用于:filename,它始终指定名为filename的文件

链接器将只在命令行上指定的位置搜索存档一次。 如果存档定义了在存档之前出现的某个对象中未定义的符号 在命令行上,链接器将包含存档中的相应文件。 但是,稍后出现在命令行上的对象中的未定义符号将被删除 不会导致链接器再次搜索存档

(我的重点)