4

私のC++コンパイラによるとg++ -print-search-dirs、...を含む多くのディレクトリでライブラリを検索しています...

  • /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 の変更されていないインストールで観察されました。

編集:詳細。

g++ -print-search-dirs結果は、bash シェルから、他のスイッチなし で実行した結果です。

からは LIBRARY_PATH も LPATH も出力されずprintenv、 と の両方が空白行echo $LPATHを返します。echo LIBRARY_PATH

4

2 に答える 2

4

回答の試み (gcc.cドライバーのソースと Makefile 環境を数分間見て収集した結果)。

これらのパスは、実行時に次のものから構築されます。

  1. GCC exec プレフィックス (のGCC ドキュメントを参照GCC_EXEC_PREFIX)
  2. 環境$LIBRARY_PATH変数
  3. $LPATH環境変数 (のように扱われます$LIBRARY_PATH)
  4. -Bコマンドライン スイッチに渡される値
  5. 標準の実行可能プレフィックス (コンパイル時に指定)
  6. ツールディレクトリプレフィックス

最後のもの (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)

于 2009-06-13T10:09:34.927 に答える
1

理論的には、/lib が /drive2/foo へのシンボリック リンクである場合、/lib/../lib は、間違っていなければ /drive2/lib を指します。理論的には...

編集:テストしたところ、そうではありません-/ libに戻ります。うーん:(

于 2009-06-13T09:30:54.613 に答える