g ++搜索/lib/../lib/,然后/ lib /

时间:2009-06-13 09:15:13

标签: linux g++ ubuntu-9.04

根据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. 如果这是不必要的冗余,那怎么办呢?

  3. 如果重要,可以在未经修改的Ubuntu 9.04上安装。

    编辑:更多信息。

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

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

2 个答案:

答案 0 :(得分:3)

尝试回答(我在几分钟内查看了gcc.c驱动程序源和Makefile环境)。

这些路径在运行时从以下构建:

  1. GCC exec前缀(请参阅GCC_EXEC_PREFIX上的GCC documentation
  2. $LIBRARY_PATH环境变量
  3. $LPATH环境变量(被视为$LIBRARY_PATH
  4. 传递给-B命令行开关
  5. 的任何值
  6. 标准可执行前缀(在编译时指定)
  7. Tooldir前缀
  8. 最后一个(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

答案 1 :(得分:1)

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

编辑:我刚刚测试过,事实并非如此 - 它回到了/ lib。 Hrm :(