Установить LD_LIBRARY_PATH из Makefile
Как установить переменную env LD_LIBRARY_PATH из Makefile?
У меня есть исходный код, который ссылается на общую библиотеку, которая, в свою очередь, связывается с другой разделяемой библиотекой (более 1). Файл Makefile для создания приложения знает только о первой общей библиотеке.
Если я хочу построить это, я должен указать:
#export LD_LIBRARY_PATH=/path/to/the/shared/libs
(для bash)
и это прекрасно работает.
Однако я хотел бы сделать это из самого Makefile.
Ответы
Ответ 1
Да, "экспорт" - это правильная директива для использования. Здесь подробно описано здесь. Это тот же механизм, что и сам, чтобы распространять переменные на субмашины. Недостатком является то, что вы не можете выборочно передавать переменную некоторым командам, а не другим.
Есть два других варианта, о которых я могу думать:
Ответ 2
Если вы не хотите экспортировать переменную LD_LIBRARY_PATH в make файл (например, поскольку у вас есть рекурсивные Make файлы, которые все добавляют к переменной), вы можете привязать их ко всем вызовам вашего компилятора и компоновщика.
Либо вы добавляете его непосредственно ко всем вызовам gcc и ld в своих целевых правилах, например.
my_target: my_target.o
LD_LIBRARY_PATH=/my/library/path gcc -o my_target my_target.o
или вы устанавливаете глобальные переменные make, которые определяют компиляторы, включают в себя путь, например:
CC=LD_LIBRARY_PATH=/my/library/path gcc
CPP=LD_LIBRARY_PATH=/my/library/path gcc
CXX=LD_LIBRARY_PATH=/my/library/path gcc
Я выбрал gcc как компилятор, но, конечно, вы можете использовать любой компилятор, который вам нравится.
Ответ 3
Я попытался добавить:
export LD_LIBRARY_PATH=/path/to/the/shared/libs
который, по-видимому, отлично работает.
Я получал ошибки, потому что мой /path/to/the/shared/libs был неправильным.
Было бы хорошо знать, что делают другие для этого и/если есть лучший способ.
Ответ 4
У меня была та же проблема, мне пришлось экспортировать LD_LIBRARY_PATH, как вы это делали:
export LD_LIBRARY_PATH=/path/to/the/shared/libs ; my_command
Мой друг показал мне альтернативу, когда LD_LIBRARY_PATH применяется только к одной команде, не заметите точки с запятой ниже.
LD_LIBRARY_PATH=/path/to/the/shared/libs my_command
Эта статья объясняет больше.