g ++search/lib/../lib/,然后/ lib /

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

  • /lib/../lib/:
  • /usr/lib/../lib/:
  • / lib目录/:
  • / usr / lib中/

/lib/../lib/地说, /lib/ /lib/../lib/ /lib/看起来和/lib/相同,lib的父节点有一个名为lib的子节点,“那个人的父亲的儿子就是我父亲的儿子的儿子”等等。 /usr/lib/../lib//usr/lib/

  1. 是否有一些原因,可能与符号链接有关,g ++应该configuration为同时search/lib/../lib//lib/

  2. 如果这是不必要的冗余,那么如何解决呢?

如果重要的话,这是在Ubuntu 9.04的未经修改的安装。

编辑:更多信息。

结果是从bash shell执行g++ -print-search-dirs而没有其他开关。

printenv不输出LIBRARY_PATH和LPATH, echo $LPATHecho LIBRARY_PATH返回空行。

一个答案的尝试(我从几分钟的时间看gcc.c驱动程序源和Makefile环境)。

这些路径是在运行时从

  1. GCC exec前缀(请参阅GCC_EXEC_PREFIX上的GCC文档 )
  2. $LIBRARY_PATH环境变量
  3. $LPATH环境变量(对待$LIBRARY_PATH
  4. 任何传递给-B命令行开关的值
  5. 标准可执行前缀(在编译期间指定)
  6. Tooldir前缀

最后一个(tooldir前缀)通常被定义为相对路径:从gcc的Makefile.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 # ie 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_PATHLPATH

那么理论上,如果/ lib是/ drive2 / foo的符号链接,那么/lib/../lib会指向/ drive2 / lib,如果我没有弄错的话。 理论上…

编辑:我刚刚测试,情况并非如此 – 它回到/ lib。 Hrm 🙁