从Makefile设置LD_LIBRARY_PATH

RD.*_*RD. 17 build-process

如何从Makefile设置LD_LIBRARY_PATH env变量?

我有一些链接到共享库的源代码,而共享库又链接到不同的共享库(超过1个).用于构建应用程序的Makefile只知道第一个共享库.

如果我想构建它,我必须指定:( #export LD_LIBRARY_PATH=/path/to/the/shared/libs对于bash)并且工作正常.

但是,我想从Makefile本身做到这一点.

Jes*_*erE 10

是的,"export"是正确的使用指令.这里详细记录.这与make本身用于将变量传播到子品牌的机制相同.缺点是您无法有选择地将变量传递给某些命令而不传递给其他命令.

我能想到另外两个选择:

  • 使用.EXPORT_ALL_VARIABLES(在某处指定为目标)会导致所有变量都被导出到子命令的环境中.
  • 在命令行上指定:

    foo:
        EXPORTEDVAR=somevalue gcc $< -o $@
    
    Run Code Online (Sandbox Code Playgroud)


小智 9

如果您不想在makefile中导出LD_LIBRARY_PATH变量(例如,因为您具有所有添加到变量的递归Makefile),您可以将其绑定到对编译器和链接器的所有调用.

您可以将其直接添加到目标规则中的所有gcc和ld调用中,例如

my_target: my_target.o
    LD_LIBRARY_PATH=/my/library/path gcc -o my_target my_target.o
Run Code Online (Sandbox Code Playgroud)

或者设置定义编译器的全局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
Run Code Online (Sandbox Code Playgroud)

我选择gcc作为编译器,但当然你可以使用你喜欢的任何编译器.


小智 5

我遇到了同样的问题,我必须像您一样导出 LD_LIBRARY_PATH:

export LD_LIBRARY_PATH=/path/to/the/shared/libs ; my_command
Run Code Online (Sandbox Code Playgroud)

当 LD_LIBRARY_PATH 仅适用于一个命令时,我的朋友向我展示了另一种选择,请注意下面没有分号。

LD_LIBRARY_PATH=/path/to/the/shared/libs my_command
Run Code Online (Sandbox Code Playgroud)

这篇文章解释了更多。


RD.*_*RD. 2

我曾尝试添加:

export LD_LIBRARY_PATH=/path/to/the/shared/libs
Run Code Online (Sandbox Code Playgroud)

显然效果很好。

我收到错误,因为我的 /path/to/the/shared/libs 不正确。

仍然很高兴知道其他人为此做了什么和/如果有更好的方法。

  • 你确定这有效吗?我的理解是,如果您从 makefile 中执行此操作,将为该进程和子进程定义“LD_LIBRARY_PATH”,但不会在运行“make”的 shell 中定义。 (2认同)