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

Я предполагаю, что этот вопрос является границей между 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 а в make- LIBRARY_NAME_DIR я просто добавляю -L $LIBRARY_NAME_DIR , который работает, но требует от меня изменения make-файлов.

Есть ли способ сделать это, не имея корневого доступа к компьютеру.

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

То, что я пробовал:

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

Я не думаю, что есть какой-либо способ сделать это исключительно чисто с переменными окружающей среды. Проблема с использованием LIBRARY_PATH видимому, заключается в том, что любой заданный параметр -L имеет приоритет. Если по какой-либо причине команда gcc имеет -L/usr/lib64 , -L/usr/lib64 будет обыскана старая версия библиотеки. По-видимому, вы собираетесь изменить Make-файлы, вы также должны быть осторожны, что -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