根据g++ -print-search-dirs
,我的C ++编译器正在许多目录中搜索库,包括......
天真地,/lib/../lib/
似乎与/lib/
是同一个目录 - lib的父母将有一个名为lib的孩子,“男人的父亲的儿子是我父亲的儿子的儿子”等等。同样适用于/usr/lib/../lib/
和/usr/lib/
是否有某些原因,或许与符号链接有关,g ++应该配置为搜索/lib/../lib/
和/lib/
?
如果这是不必要的冗余,那怎么办呢?
如果重要,可以在未经修改的Ubuntu 9.04上安装。
编辑:更多信息。
结果来自执行g++ -print-search-dirs
而没有其他开关,来自bash shell。
LIBRARY_PATH和LPATH都不会从printenv
输出,echo $LPATH
和echo LIBRARY_PATH
都会返回空行。
答案 0 :(得分:3)
尝试回答(我在几分钟内查看了gcc.c
驱动程序源和Makefile环境)。
这些路径在运行时从以下构建:
GCC_EXEC_PREFIX
上的GCC documentation)$LIBRARY_PATH
环境变量$LPATH
环境变量(被视为$LIBRARY_PATH
)-B
命令行开关最后一个(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_PATH
,LPATH
)
答案 1 :(得分:1)
好吧,理论上,如果/ lib是/ drive2 / foo的符号链接,那么/lib /../lib会指向/ drive2 / lib,如果我没弄错的话。理论上...
编辑:我刚刚测试过,事实并非如此 - 它回到了/ lib。 Hrm :(