将环境变量从makefile导出到shell

将环境变量从makefile导出到shell,makefile,gnu-make,Makefile,Gnu Make,我想修改并导出“LD_LIBRARY_PATH”环境变量,以便用我的代码链接libjvm.so。下面是我的Makefile: all: run helloWorld.class: helloWorld.java javac helloWorld.java hello_world: hello_world.c gcc -L/usr/lib/jvm/java-8-openjdk-amd64/jre/lib/amd64/server/ -I/usr/lib/jvm/jav

我想修改并导出“LD_LIBRARY_PATH”环境变量,以便用我的代码链接libjvm.so。下面是我的Makefile:

 all: run

 helloWorld.class: helloWorld.java
     javac helloWorld.java

 hello_world: hello_world.c
     gcc -L/usr/lib/jvm/java-8-openjdk-amd64/jre/lib/amd64/server/ -I/usr/lib/jvm/java-8-openjdk-amd64/include -I/usr/lib/jvm/java-8-openjdk-amd64/include/linux/ hello_world.c -o hello_world_c_exec -ljvm

 run: helloWorld.class hello_world 
     export LD_LIBRARY_PATH="/usr/lib/jvm/java-8-openjdk-amd64/jre/lib/amd64/server/"
     ./hello_world_c_exec

 clean:
     rm -f helloWorld.class hello_world
在名为“run”的目标中,我导出“LD_LIBRARY_PATH”环境变量。但它不会导出到我当前的shell中

我得到以下错误: ./hello_world_c_exec:加载共享库时出错:libjvm.so:无法打开共享对象文件:没有这样的文件或目录


如何使用makefile导出“LD_LIBRARY_PATH?”

配方的每一行通常在单独的shell中执行,这意味着您的
导出
行进入的shell与
/hello\u world\u c\u exec
行不同。你自己看看:

$ cat Makefile
JVM_DIR := /tools/opt/jdk-10.0.2/lib/server

foo: LDLIBS := -ljvm
foo: LDFLAGS := -L$(JVM_DIR)

.PHONY: run
run: foo
        export LD_LIBRARY_PATH=$(JVM_DIR)
        $(<D)/$(<F)
注:对于每一条单独的生产线,启动了两个单独的过程(18709和18710)。如果它在单个shell中运行,您可以通过以下几种方式使其工作:

  • 将其设置为单个脚本:
  • 相反,我会告诉链接器将提示嵌入到哪里可以找到库,这样就根本不需要
    LD\u library\u路径

    $ cat Makefile
    JVM_DIR := /tools/opt/jdk-10.0.2/lib/server
    
    foo: LDLIBS := -ljvm
    foo: LDFLAGS := -L$(JVM_DIR) -Wl,-rpath,$(JVM_DIR)
    
    .PHONY: run
    run: foo
            $(<D)/$(<F)
    
    $ make run
    cc   -L/tools/opt/jdk-10.0.2/lib/server -Wl,-rpath,/tools/opt/jdk-10.0.2/lib/server  foo.c  -ljvm -o foo
    ./foo
    
    $ ./foo
    $ echo $?
    0
    
    $cat Makefile
    JVM_DIR:=/tools/opt/jdk-10.0.2/lib/server
    foo:LDLIBS:=-ljvm
    foo:LDFLAGS:=-L$(JVM\u DIR)-Wl,-rpath,$(JVM\u DIR)
    .骗子:快跑
    run:foo
    
    $(试着将两个命令放在一行:
    export LD_LIBRARY_PATH=…;/hello_world_c_exec
    。如果这样做有效,我会解释原因。只是为了学究,如果它在同一行,你就不需要导出它:只要不要使用分号。像这样写:
    LD_LIBRARY_PATH=…../hello_world__c_exec
    @Beta-它就像你说的那样有效。拉斯比有下面提供了一个很好的解释,所以我想这对我来说很好。谢谢!
    $ cat Makefile
    JVM_DIR := /tools/opt/jdk-10.0.2/lib/server
    
    foo: LDLIBS := -ljvm
    foo: LDFLAGS := -L$(JVM_DIR)
    
    .PHONY: run
    run: foo
            export LD_LIBRARY_PATH=$(JVM_DIR); \
            $(<D)/$(<F)
    
    $ make run -d
    ...
    Must remake target 'run'.
    export LD_LIBRARY_PATH=/tools/opt/jdk-10.0.2/lib/server; \
    ./foo
    Putting child 0x21aa780 (run) PID 22009 on the chain.
    Live child 0x21aa780 (run) PID 22009
    Reaping winning child 0x21aa780 PID 22009
    Removing child 0x21aa780 PID 22009 from chain.
    Successfully remade target file 'run'.
    
    $ cat Makefile
    JVM_DIR := /tools/opt/jdk-10.0.2/lib/server
    
    foo: LDLIBS := -ljvm
    foo: LDFLAGS := -L$(JVM_DIR)
    
    .PHONY: run
    run: foo
            LD_LIBRARY_PATH=$(JVM_DIR) $(<D)/$(<F)
    
    $ make run
    LD_LIBRARY_PATH=/tools/opt/jdk-10.0.2/lib/server ./foo
    
    $ cat Makefile
    JVM_DIR := /tools/opt/jdk-10.0.2/lib/server
    
    foo: LDLIBS := -ljvm
    foo: LDFLAGS := -L$(JVM_DIR)
    
    .ONESHELL:
    
    .PHONY: run
    run: foo
            export LD_LIBRARY_PATH=$(JVM_DIR)
            $(<D)/$(<F)
    
    $ make run -d
    ...
    Must remake target 'run'.
    export LD_LIBRARY_PATH=/tools/opt/jdk-10.0.2/lib/server
    ./foo
    Putting child 0x25258f0 (run) PID 31367 on the chain.
    Live child 0x25258f0 (run) PID 31367
    Reaping winning child 0x25258f0 PID 31367
    Removing child 0x25258f0 PID 31367 from chain.
    Successfully remade target file 'run'.
    
    $ make run
    cc   -L/tools/opt/jdk-10.0.2/lib/server  foo.c  -ljvm -o foo
    export LD_LIBRARY_PATH=/tools/opt/jdk-10.0.2/lib/server
    ./foo
    $ ./foo
    ./foo: error while loading shared libraries: libjvm.so: cannot open shared object file: No such file or directory
    
    $ cat Makefile
    JVM_DIR := /tools/opt/jdk-10.0.2/lib/server
    
    foo: LDLIBS := -ljvm
    foo: LDFLAGS := -L$(JVM_DIR) -Wl,-rpath,$(JVM_DIR)
    
    .PHONY: run
    run: foo
            $(<D)/$(<F)
    
    $ make run
    cc   -L/tools/opt/jdk-10.0.2/lib/server -Wl,-rpath,/tools/opt/jdk-10.0.2/lib/server  foo.c  -ljvm -o foo
    ./foo
    
    $ ./foo
    $ echo $?
    0