10

我在我的 Linux Mint 14 Nadia 中安装了 Matlab(a uname -a 显示:Linux Ideapad-Z570 3.5.0-17-generic #28-Ubuntu SMP Tue Oct 9 19:31:23 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux)和从命令行调用它时,我会得到:“/lib64/libc.so not found”。

我通过在 /lib64 中创建一个链接来遵循 mathworks 的帮助:

ln -s /lib/x86_64-linux-gnu/libc.so.6 .

这解决了这个问题。

现在,如果我对这个库进行定位,我会得到:

locate "libc.so"
/lib/i386-linux-gnu/libc.so.6
/lib/x86_64-linux-gnu/libc.so.6
/usr/lib/x86_64-linux-gnu/libc.so

我将在这台计算机上使用 gcc 进行编译,我想要完整的 64 位编译。拥有所有这些不同的 libc.so 库究竟意味着什么?gnu 编译器将使用哪一个?我需要用 gcc 做任何不同的事情来编译 64 位吗?

我也很想尽可能优化我的新 i7 内核!!!

4

3 回答 3

13

/lib/i386-linux-gnu/libc.so.6

这是该库的 32 位版本。

/lib/x86_64-linux-gnu/libc.so.6

这是该库的 64 位版本。

两者通常都是指向实际库文件的符号链接,通常会根据 glibc 版本号命名,例如libc-2.15.so

/usr/lib/x86_64-linux-gnu/libc.so

这不是一个库,而是一个链接器脚本文件,它引用了上面的符号链接。

为什么我们需要所有这些:

首先,无论安装的 libc 版本如何,链接器都会搜索libc.so,因为编译器驱动程序总是会将-lc选项传递给链接器。名称libc保持不变,并表示该库的最新版本。

符号链接以库的sonamelibc.so.6命名,或多或少对应于库的 ABI 版本。链接的可执行文件实际上包含对.libc.solibc.so.6

如果我们想象有一天发布了一个严重不兼容 ABI 的 libc,它的 soname 可以命名为libc.so.7,例如,这个版本可以与旧libc.so.6版本共存,因此与一个或另一个链接的可执行文件可以在同一个系统中共存,

最后,名称libc-2.15.so指的是 libc 版本,当您安装新的 libc 包时,名称将更改为libc-2.16.so. 如果它与以前的版本二进制兼容,则libc.so.6链接将保持这种命名方式,并且现有的可执行文件将继续工作。

于 2012-12-09T20:13:51.227 回答
3

要找到使用哪个,您必须首先找到ld(链接器)用于查找库的顺序,如下所示:

ld --verbose | grep SEARCH

对我来说,它给了我这个输出:

SEARCH_DIR("/usr/x86_64-unknown-linux-gnu/lib64"); SEARCH_DIR("/usr/x86_64-unknown-linux-gnu/lib"); SEARCH_DIR("/usr/lib"); SEARCH_DIR("/usr/local/lib");

这意味着在我的计算机上ld,按顺序查看这些目录:

  1. /usr/x86_64-unknown-linux-gnu/lib64
  2. /usr/x86_64-unknown-linux-gnu/lib
  3. /usr/lib
  4. /usr/local/lib

因此,如果 libc 在 /usr/x86_64-unknown-linux-gnu/lib64 中,并且 libc 也在 /usr/lib 中,它将使用 /usr/x86_64-unknown-linux-gnu/lib64 版本,因为它已列出第一的。

于 2012-12-09T19:42:33.970 回答
1

您创建的符号链接对 GCC 没有任何影响。32 位版本仅在使用-m32GCC 标志编译时使用。GCC 不会尝试生成 32 位二进制文​​件,除非您明确告诉它(通过使用该标志。)

于 2012-12-09T19:52:07.430 回答