относительные пути g ++ - PullRequest
4 голосов
/ 08 мая 2011

Я пытаюсь спроектировать общую библиотеку общих библиотек, используя g ++, в надежде упростить мои сценарии компиляции и упростить процесс обновления в будущем, но я все еще новичок в лучшем случае с инструментами GNU и написанием библиотек.,Может ли кто-нибудь дать совет о том, возможна ли следующая идея с g ++?

Для удобства рассмотрим следующую схему файловой системы:

main.cpp
libraryX/
libraryX/libX.so
libraryX/libraryY/
libraryX/libraryY/libY.so
libraryX/libraryZ/
libraryX/libraryZ/libZ.so

Моя цель - иметь возможность косвенно ссылаться с помощью каскадированияотносительные пути.Например, main.cpp ссылается на libraryX / libX.so, который ссылается на libraryY / libY.so и libraryZ / libZ.so.Можно ли связать main.cpp только с libX.so и использовать функции, определенные в libY.so и libZ.so?

Если да, не могли бы вы привести пример флагов, которые понадобятся для этого?Я пробовал варианты следующей команды, используя различные источники от Google, но безрезультатно:

g++ -shared -fPIC -Wl-rpath=libraryX -LlibraryX -lX.so main.o -o executable

Любые рекомендации или ссылки очень ценятся.

1 Ответ

1 голос
/ 09 мая 2011

Не делайте этого (даже если вы можете выяснить, как).

Когда вы ссылаетесь на -lX, статический компоновщик должен знать все другие общие библиотеки, которые являются «частью этой ссылки».Поскольку -lY не находится на линии связи, статический компоновщик либо выдаст вам ошибку, либо должен каким-то образом выяснить, откуда исходит libY.so.Для последнего он должен повторить поиск RPATH, который будет выполнять загрузчик времени выполнения.Эта репликация подвержена ошибкам (статический компоновщик может не использовать точно такой же алгоритм) и ее лучше избегать.

Наконец, ваша командная строка совершенно неверна: -shared означает, что вы запрашиваете компоновщик для общей библиотеки, новы явно пытаетесь связать исполняемый файл.Обычно вы не должны использовать -fPIC при компоновке исполняемого файла.Также -Wl-rpath=... должно быть -Wl,-rpath=... (запятая важна).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...