g ++ ищет /lib/../lib/, затем / lib / - PullRequest
3 голосов
/ 13 июня 2009

Согласно g++ -print-search-dirs мой компилятор C ++ ищет библиотеки во многих каталогах, включая ...

  • / Библиотека /../ Библиотека /:
  • / USR / Библиотека /../ Библиотека /:
  • / Lib /:
  • / usr / lib /

Наивно, /lib/../lib/ может показаться тем же каталогом, что и /lib/ & mdash; У родителя 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 возвращают пустые строки.

Ответы [ 2 ]

3 голосов
/ 13 июня 2009

Попытка ответа (которую я собрал после нескольких минут просмотра источника драйвера gcc.c и среды Makefile).

Эти пути создаются во время выполнения из:

  1. Префикс GCC exec (см. Документация GCC на GCC_EXEC_PREFIX)
  2. Переменная окружения $LIBRARY_PATH
  3. Переменная окружения $LPATH (которая обрабатывается как $LIBRARY_PATH)
  4. Любые значения, передаваемые -B ключ командной строки
  5. Стандартные исполняемые префиксы (как указано во время компиляции)
  6. Префикс Tooldir

Последний (префикс tooldir) обычно определяется как относительный путь: Из ГКК 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 голос
/ 13 июня 2009

Ну, теоретически, если / lib была символической ссылкой на / drive2 / foo, то /lib/../lib будет указывать на / drive2 / lib, если я не ошибаюсь. Теоретически ...

Редактировать: Я только что проверил, но это не так - он возвращается к / lib. Хрм: (

...