Установить LD_LIBRARY_PATH из Makefile

Как установить переменную env LD_LIBRARY_PATH из Makefile?

У меня есть исходный код, который ссылается на общую библиотеку, которая, в свою очередь, связывается с другой разделяемой библиотекой (более 1). Файл Makefile для создания приложения знает только о первой общей библиотеке.

Если я хочу построить это, я должен указать:  #export LD_LIBRARY_PATH=/path/to/the/shared/libs (для bash) и это прекрасно работает.

Однако я хотел бы сделать это из самого Makefile.

Ответы

Ответ 1

Да, "экспорт" - это правильная директива для использования. Здесь подробно описано здесь. Это тот же механизм, что и сам, чтобы распространять переменные на субмашины. Недостатком является то, что вы не можете выборочно передавать переменную некоторым командам, а не другим.

Есть два других варианта, о которых я могу думать:

  • Использование .EXPORT_ALL_VARIABLES (указать как цель где-то), приводит к тому, что все переменные будут экспортированы в среду подкоманд.
  • Укажите в командной строке:

    foo:
        EXPORTEDVAR=somevalue gcc $< -o [email protected]
    

Ответ 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

Эта статья объясняет больше.