2009-06-13 55 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