%20%D0%B2%D0%B5%D1%80%D1%81%D0%B8%D1%8F%20%D0%B1%D0%B8%D0%B1%D0%BB%D0%B8%D0%BE%D1%82%D0%B5%D0%BA%D0%B8.png)
Я предполагаю, что этот вопрос находится на грани между 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