4

根据g++ -print-search-dirs我的 C++ 编译器正在许多目录中搜索库,包括...

  • /lib/../lib/:
  • /usr/lib/../lib/:
  • /lib/:
  • /usr/lib/

天真地,/lib/../lib/似乎与/lib/lib 的父级将有一个名为 lib 的子目录相同的目录,“那个人的父亲的儿子是我父亲的儿子的儿子”等等。这同样适用于/usr/lib/../lib//usr/lib/

  1. 是否有某种原因(可能与符号链接有关)应该将 g++ 配置为同时搜索/lib/../lib/​​ 和/lib/

  2. 如果这是不必要的冗余,人们将如何解决它?

如果重要的话,在未修改的 Ubuntu 9.04 安装中观察到了这一点。

编辑:更多信息。

结果是在g++ -print-search-dirs没有其他开关的情况下从 bash shell 执行的。

LIBRARY_PATH 和 LPATH 都不是从 输出的printenv,并且两者都echo $LPATH返回echo LIBRARY_PATH空行。

4

2 回答 2

4

gcc.c尝试回答(我从查看驱动程序源和 Makefile 环境的几分钟中收集到)。

这些路径是在运行时从以下位置构建的:

  1. GCC exec 前缀(参见GCC文档GCC_EXEC_PREFIX
  2. 环境$LIBRARY_PATH变量
  3. 环境变量(被$LPATH视为$LIBRARY_PATH
  4. 传递给-B命令行开关的任何值
  5. 标准可执行前缀(在编译时指定)
  6. 工具目录前缀

最后一个(tooldir前缀)通常定义为相对路径:From gcc'sMakefile.in

# Directory in which the compiler finds libraries etc.
libsubdir = $(libdir)/gcc/$(target_noncanonical)/$(version)
# Directory in which the compiler finds executables
libexecsubdir = $(libexecdir)/gcc/$(target_noncanonical)/$(version)
# Used to produce a relative $(gcc_tooldir) in gcc.o
unlibsubdir = ../../..
....
# These go as compilation flags, so they define the tooldir base prefix
# as ../../../../, and the one of the library search prefixes as ../../../
# These get PREFIX appended, and then machine for which gcc is built
# i.e i484-linux-gnu, to get something like: 
# /usr/lib/gcc/i486-linux-gnu/4.2.3/../../../../i486-linux-gnu/lib/../lib/
DRIVER_DEFINES = \
-DSTANDARD_STARTFILE_PREFIX=\"$(unlibsubdir)/\" \
-DTOOLDIR_BASE_PREFIX=\"$(unlibsubdir)/../\" \

但是,这些是针对特定于编译器版本的路径。您的示例可能会受到我上面列出的环境变量的影响(LIBRARY_PATH, LPATH

于 2009-06-13T10:09:34.927 回答
1

好吧,理论上,如果 /lib 是 /drive2/foo 的符号链接,那么 /lib/../lib 如果我没记错的话,将指向 /drive2/lib。理论上...

编辑:我刚刚测试过,但事实并非如此 - 它回到 /lib。人力资源管理:(

于 2009-06-13T09:30:54.613 回答