Страницы

Поиск по вопросам

среда, 10 июля 2019 г.

Линковка своих динамических библиотек к исполняемому файлу

Пишу Makefile для проекта, который использует стороннюю динамическую библиотеку. Библиотека лежит в определённой директории, не входящей в список дефолтных.
Компиляция проходит успешно. Проблемы, очевидно, с запуском - не может найти библиотеку.
Можно ли составить Makefile так, чтобы он выполнял функцию, аналогичную функции link_directories в CMake? То есть, чтобы в исполняемый файл был как бы "зашит" путь до библиотеки.


Ответ

Согласно man ld нужно сообщить линкеру параметр -rpath=тот_самый_путь к библиотекам, который нужно зашить в бинарник. Сделать это можно двумя способами. Через опцию gcc -Xlinker -rpath=тот_самый_путь. Если вы используете правила сборки make по-умолчанию, для этих опций подходит переменная LDFLAGS в Makefile:
LDFLAGS+= -Xlinker -rpath=тот_самый_путь
Второй способ -- минуя gcc через переменную окружения LD_RUN_PATH которую ld читает сам в случае, если опции -rpath не было. В Makefile для этого можно написать:
export LD_RUN_PATH=тот_самый_путь
Или написать LD_RUN_PATH=тот_самый_путь перед $(CC) непосредственно в правиле для линковки.
В пути может присутствовать подстрока $ORIGIN, вместо которой будет подставлен путь к каталогу, содержащему исполняемый файл. См. man ld-linux.so. Пример строки в Makefile:
myprogram: LDFLAGS+= -Xlinker -rpath='$$ORIGIN/' myprogram: myprogram.o

Комментариев нет:

Отправить комментарий