C标准库的位置

46
在gcc手册中提到:“C标准库本身存储在 '/usr/lib/libc.a'。”我已经安装了gcc,但无法在所述位置找到libc.a文件。想知道它在哪里。
我在/usr/lib位置发现了许多.so文件。它们是什么?

你尝试过询问你的软件包管理器吗? - Ignacio Vazquez-Abrams
我知道这是一个老问题,但当前的gcc文档(7.3.0和8.2.0)没有这个措辞。在某些类Unix系统上,您可以编译和链接一个简单的程序,并在可执行文件上运行“ldd”。 - Keith Thompson
5个回答

53

如果您正在寻找 libc.a

$ gcc --print-file-name=libc.a
/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/libc.a

6
迄今为止,这是最正确的答案——它使用一个标准工具来找到libc的位置,这种方法在任何方面都是标准的(正如我所发现的)。 - akhan

35

以下是需要注意的几点:

  • gccglibc是两个不同的东西。gcc是编译器,glibc是运行时库。基本上所有东西都需要glibc来运行。
  • .a文件是静态库,.so表示共享对象,是Linux下动态链接库(DLL)的等价物。
  • 大多数东西不会链接到libc.a,而是链接到libc.so

希望这能为您澄清问题。至于位置,它几乎肯定位于/usr/lib/libc.a和/或/usr/lib/libc.so。正如我所说,.so是更常见的。


libc.so 是动态链接的,而 libc.a 是静态链接的吗? - softwarematter
18
libc.so和libc.a都提供相同的功能。不同之处在于,如果你链接libc.so,每当libc.so升级时,你的程序都可以从升级中受益,而无需进行任何更改。然而,如果你链接libc.a,所有功能都会打包到你的程序中。libc的新更新不会更新你的程序,因此它将需要重新编译。 - Chris Eberle
4
没错,.so 是动态链接的,而 .a 是静态链接的。 - Chris Eberle

9
如果您使用基于RPM的Linux(Red Hat / CentOS / Fedora / SUSE),则可以通过以下命令获取已安装glibc的位置:rpm -ql glibcrpm -ql glibc-devel
使用locate libc.a命令可以获取其位置。要查看它来自哪里,请执行以下操作:rpm -qf /usr/lib/libc.a 以下是rpm -qi关于这些软件包的信息:
glibc-devel:
该软件包包含开发程序所需的目标文件,这些程序使用标准C库(几乎所有程序都使用)。如果您正在开发将使用标准C库的程序,则系统需要可用这些标准目标文件以创建可执行文件。如果您要开发将使用标准C库的程序,请安装glibc-devel。
glibc:
该软件包包含多个程序在系统上使用的标准库。为了节省磁盘空间和内存,并使升级更加容易,通用系统代码被保存在一个地方并在程序之间共享。此特定软件包包含最重要的共享库集:标准C库和标准数学库。没有这两个库,Linux系统将无法正常运行。

3
您需要单独安装静态库的软件包: glibc-static.i686

2

在CentOS 5.8上

$ ls -l /usr/lib/libc.a
-rw-r--r--  1 root root 2442786 Apr  8  2010 /usr/lib/libc.a

$ rpm -qf /usr/lib/libc.a
glibc-devel-2.3.4-2.43.el4_8.3

您还需要在RedHat发行版下安装glibc-devel软件包。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接