Связывание зависимости - PullRequest
2 голосов
/ 30 июля 2011

Начните с разделяемой библиотеки libA.so, которая находится в / some / lib. Я строю библиотеку (libB.so), которая зависит от возможностей в libA.so. Поэтому при создании libB.so я включаю -L / some / lib -lA в командную строку g ++. libB.so также будет находиться в /some/lib.

Теперь я создаю исполняемый файл, который будет использовать libB.so. Я предоставляю ожидаемые -L / some / lib и -lB для компоновщика g ++. Но я получаю ошибку, потому что не могу найти "libA.so". Если я добавлю «-lA» в строку компоновщика, программа выполнит ссылку.

Я не понимаю, почему он не находит "libA.so". Я, конечно, не понимаю, почему включение «-lA» в строку компоновщика позволяет найти его. Кажется, он уже знает, что ему нужен libA.so, а libA.so находится по тому же пути, что и libB.so.

Может кто-нибудь объяснить это? Мне не нравится идея явно указывать «-lA» в каждом исполняемом файле, который хочет связать libB.so. Я сделал что-то еще не так?

1 Ответ

4 голосов
/ 30 июля 2011

Пока вы связываете только с libB, компоновщик ищет libA, но не может его найти, потому что он не находится в пути поиска для компоновщика / загрузчика. Вы должны установить LD_LIBRARY_PATH (и / или LD_RUN_PATH) на этапе связывания, или иначе связать libB с -rpath /some/lib.

Просто представьте на минуту, что libB сам по себе является исполняемым файлом, назовем его foo. Вы не можете просто сказать ./foo в командной строке, потому что libA не найден (отметьте ldd foo, чтобы изучить пути загрузчика). Вместо этого вам нужно

LD_LIBRARY_PATH=/some/lib ./foo

или вам нужно скомпилировать с rpath. (В g++ вы бы сказали g++ -Wl,-rpath,/some/lib ..., чтобы передать параметр компоновщику.) Тот же процесс разрешения времени загрузки применяется к самим динамическим библиотекам.

...