Как настроить среду таким образом, чтобы использовалась правильная (отличная от системной) версия библиотеки

Как настроить среду таким образом, чтобы использовалась правильная (отличная от системной) версия библиотеки

Я предполагаю, что этот вопрос находится на грани между ServerFault и StackOverflow и этим сайтом. Но я думаю, что U&L наиболее актуален.

У меня есть C++код, который зависит от библиотеки в версии X, а система предоставляет версию Y(X>Y). Я скомпилировал эту библиотеку и поместил полученные файлы в /opt/lib_name/X/lib, версия Yустановлена ​​в /usr/lib64. Я хочу связать с soбиблиотеками.

Теперь я хотел бы создать скрипт, который каким-то образом включает версию X, чтобы любой код, который я создаю, gccкомпилировался с версией Xбез каких-либо изменений в make-файлах.

Сейчас я устанавливаю LIBRARY_NAME_DIRпеременную и просто добавляю в makefile -L $LIBRARY_NAME_DIR, что работает, но требует изменения makefile.

Есть ли способ сделать что-то подобное, не имея root-доступа к компьютеру?

Примечание: хотя я считаю, что ответ на этот вопрос не зависит от конкретной библиотеки или кода, все подробности по моей конкретной проблеме приведены здесь:https://stackoverflow.com/q/24189130/7918.

Что я пробовал:

  • Я установил: LIBRARY_PATH, LD_LIBRARY_PATH, CPLUS_INCLUDE_PATH.

решение1

Я не думаю, что есть какой-либо способ сделать это надежно, используя только переменные окружения. Проблема с использованием, LIBRARY_PATHпохоже, в том, что любая заданная -Lопция имеет приоритет. Если по какой-либо причине gccкоманда имеет -L/usr/lib64, то сначала будет выполнен поиск по нему, и будет найдена старая версия библиотеки. Судя по всему, вы собираетесь изменить Makefiles, вам также следует быть осторожным, чтобы a -L/usr/lib64не стоял первым.

Однако, глядя на ваш вопрос SO, не похоже, что вышеизложенное является проблемой. Однако :в значении вашей LIBRARY_PATHпеременной есть ненужное окончание, которое может объяснить, почему это не сработало.

Кроме того, как отмечено в ответе на вопрос SO, LD_LIBRARY_PATHиспользуется динамическим компоновщиком и имеет значение только привремя выполнениядля вашего приложения. Это можно использовать, если местоположение динамических библиотек не может быть найдено при запуске приложения. GNU-линковщик использует LD_RUN_PATH, который по сути делает для -rpathто же, что LIBRARY_PATHи для -rpath, за исключением указания любых -rpathсредств, которые LIBRARY_PATHбудут проигнорированы (а не просто получат более низкий приоритет).

Тогда вы можете попробовать следующее:

LIBRARY_PATH=/opt/lib_name/X/lib LD_RUN_PATH=/opt/lib_name/X/lib make

Более надежным решением может быть создание скрипта-оболочки, gccвключающего необходимые параметры, например:

#!/bin/sh
gcc -L/opt/lib_name/X/lib -Wl,-rpath,/opt/lib_name/X/lib "$@"

Назовите файл gcc, сделайте его исполняемым и поместите его в отдельную директорию (или по крайней мере в ту, где нет файлов с тем же именем, что и у важных команд). Затем вы можете запустить makeтак:

PATH=/path/to/script:$PATH make

Связанный контент