为什么有些系统库需要-l选项,而另一些则不需要-l选项?

时间:2018-08-15 21:05:48

标签: c compilation

我最近参加了一个使用pthread的类,并且在编译时被告知要添加-lpthread。但是,当使用其他#include <>语句作为系统头文件时,对象实现代码的链接似乎自动发生了吗?例如,如果我只想获取头文件#include <stdio.h>,则在编译时不需要-l选项,则只需执行该.o实现文件文件的链接。

6 个答案:

答案 0 :(得分:1)

为此文件

#include <stdio.h>

int main() {
  return 0;
}

运行

gcc -v -o simple simple.c

,您将看到gcc的实际作用。您将看到它与背后的库链接。这就是为什么您没有明确指定系统库的原因。

答案 1 :(得分:1)

基本答案:-lpthreads告诉编译器/链接器链接到pthreads库。

更长的答案
标头告诉编译器,当以后链接代码时,某个功能将可用(有时该功能在标头中定义,也许是内联)。因此,编译器将功能标记为基本可用,但是在链接阶段之后,链接器必须将功能调用连接到实际功能。系统头文件中的许多功能是链接程序自动使用的“ C运行时库”的一部分,而其他功能则由外部库(例如pthreads)提供。如果是由外部库提供的,则必须使用“ -lxxx”,以便编译器/链接器知道要在该过程中包括哪个外部库,以便正确获取函数的地址。

希望有帮助

答案 2 :(得分:1)

C头文件不包含函数的实现。它仅包含函数原型,以便编译器可以生成正确的函数调用。

实际实现存储在库中。最常用的功能(例如printfmalloc在标准C库(LibC)中实现,该库隐式链接到任何可执行文件,除非您请求不链接它。线程支持在单独的库中实现,必须通过将-pthread选项传递给链接程序来明确链接。

注意:您可以将选项-pthread传递给编译器that will also link the appropriate library

答案 3 :(得分:1)

编译器隐式链接标准C库libc.a,因此不需要-lc参数。 Pthreads是一个系统库,但不是C标准库的一部分,因此必须进行显式链接。

如果要指定-nolibc,则需要显式链接libc(或某些替代的C库)。

如果所有系统库都隐式链接,则每个系统的gcc必须具有不同的实现(例如pthreads不是Windows上的系统库),并且如果系统引入了新的库,则gcc必须更改处于锁定状态。此外,随着以某种未知顺序搜索每个库以解析符号,链接时间将增加。 C标准库是编译器可以在任何特定实现中提供的库,因此隐式链接通常是安全的,并且操作简便。

答案 4 :(得分:0)

-l选项用于链接到外部库(在这种情况下,libpthread,默认情况下是链接到系统库

http://www.network-theory.co.uk/docs/gccintro/gccintro_17.html

C++: How to add external libraries

答案 5 :(得分:0)

为方便起见,默认情况下会搜索某些库文件,基本上是C标准库。链接器具有禁用此便利性的选项,并且没有默认库(因为如果您正在做一些不寻常的操作,并且不需要它们)。非默认库,您必须告诉链接器使用它们。

可以 一种机制来告诉源代码中需要什么库(包含文件是纯文本,在#include行中只是“复制粘贴”),没有技术上的困难。但是只是没有(据我所知,甚至还没有非标准的编译器扩展名)。

尽管有一些解决方案,例如用于unixy平台的 pkg-config ,它通过轻松提供库的编译器和链接器选项来解决包含文件和库文件的问题。 / p>