2009-06-13 58 views
3

根据g++ -print-search-dirs我的C++编译器正在寻找在多个目录中,包括图书馆......G ++搜索/lib/../lib/,然后/ lib目录/

  • /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的未经修改的安装中观察到的。

编辑:更多信息。

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

printenv既不输出LIBRARY_PATH也不输出LPATH,并且echo $LPATHecho LIBRARY_PATH都返回空行。

+0

一个很好的问题 - 你应该看看我的MinGW库的路径是什么样的,我不知道为什么! – 2009-06-13 09:28:36

回答

1

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

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

3

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

这些路径在运行时被构造从:

  1. GCC EXEC前缀(见GCC_EXEC_PREFIXGCC documentation
  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 
# 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_PATHLPATH

+0

@ASk,我在环境(bash)中检查了LIBRARY_PATH和LPATH,并且都没有定义。追踪g ++来源应该保证以解决这个谜题而终止;谢谢你的线索。 – 2009-06-13 13:20:48