Компиляция g ++: могу ли я ссылаться на каталог с бинарными символами? - PullRequest
0 голосов
/ 28 февраля 2019

Компиляции ниже:

g++ -L../../lib -o my_prog my_prog.cpp -ltest1 -ltest2

, где ../../lib содержит символические ссылки на libtest1.so и libtest2.so

Но я получаю ошибку, когда язапустите программу: «ошибка при загрузке общих библиотек: libtest1.so: невозможно открыть общий объектный файл: нет такого файла или каталога», и я не уверен, является ли символическая ссылка виновником.

Ответы [ 2 ]

0 голосов
/ 28 февраля 2019

Опция -L предназначена для компоновщика ld, чтобы найти .a и .so во время компоновки.

Параметр -Wl,-rpath= предназначен для динамического компоновщика ld.so, чтобы найти .so при запуске приложения.Вам необходимо использовать -Wl,-rpath=, когда необходимая общая библиотека не находится в (стандартной системе) каталогах, указанных в /etc/ld.so.conf.

Использовать $ORIGIN динамический компоновщик переменную, чтобы сделать rpath относительнопуть к вашему исполняемому файлу:

g++ -L../../lib -Wl,-rpath='${ORIGIN}/../../lib' -o my_prog my_prog.cpp -ltest1 -ltest2

Будьте осторожны, чтобы убедиться, что ${ORIGIN} не раскрыт оболочкой или вашим make-файлом (вот почему он заключен в одинарные кавычки).

${ORIGIN}:

$ORIGIN и rpath

ld.so понимает строку $ORIGIN (или эквивалентно ${ORIGIN}) в спецификации rpath (DT_RPATH или DT_RUNPATH) для обозначения каталога, содержащего исполняемый файл приложения.Таким образом, приложение, расположенное в somedir / app, может быть скомпилировано с gcc -Wl,-rpath,'$ORIGIN/../lib', так что оно находит связанную разделяемую библиотеку в somedir / lib независимо от того, где somedir находится в иерархии каталогов.Это облегчает создание приложений «под ключ», которые не нужно устанавливать в специальные каталоги, но вместо этого их можно распаковать в любой каталог и найти собственные разделяемые библиотеки.

0 голосов
/ 28 февраля 2019

То, что происходит в время выполнения , связано с rpath .

Вы можете (не очень рекомендуется, см. this ) установитьваш LD_LIBRARY_PATH перед запуском вашего исполняемого файла или, что еще лучше, вы хотите установить rpath исполняемого файла при его связывании (например, передавая -Wl,--rpath $(realpath ../../lib/) команде g++, выполняющей ссылку.

Прочитайте Drepper's Как писать общие библиотеки бумага и Библиотека программ HowTo

...